PixelBender开发人员指南6950.docx

上传人:you****now 文档编号:68869601 上传时间:2022-12-30 格式:DOCX 页数:61 大小:592.21KB
返回 下载 相关 举报
PixelBender开发人员指南6950.docx_第1页
第1页 / 共61页
PixelBender开发人员指南6950.docx_第2页
第2页 / 共61页
点击查看更多>>
资源描述

《PixelBender开发人员指南6950.docx》由会员分享,可在线阅读,更多相关《PixelBender开发人员指南6950.docx(61页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Pixel Bender工具包概述开始编写Pixxel Bennderr滤镜本章讨论PPixeel BBendder语语言编写写的特殊殊功能。一个内核部部分在Pixeel BBendder图图像处理理的基本本单位是是内核。每个像素机核心语言程序定义了一个内核,由一个单一的字符串,包含语言版本的内核语句中指定的元素。所需需要的语语言版本本的元素素kerneel nnameekerneel mmembberss变量和和函数包包括在这这对花括括号内内核语句包包含一个个名字,一一组元数数据的方方括号中中,描述述了内核核,和一一组成员员的花括括号括起起来的定定义的过过滤操作作内核的数据据元素每一个内核核

2、定义之之前需要要的语言言版本的的元素。这个声明和元数据部分(可以修改)被提供时自动创建在Pixel Bender工具包IDE的一个新的过滤器。元数据部分分提供命命名空间间,内核核版本,和和其他的的识别和和描述信信息。这这是特别别重要的的是当你你收集的的几个内内核的图图形来执执行更复复杂的操操作。比比如说呢呢。命名空间,供供应商,和和版本值值是必需需的;说说明是可可选的。1.供应商商的公司司或个人人谁写的的筛选器器名称。2他是一一个版本本的整数数版本号号应该开开始在11增加了了新的内内核版本本。这允允许你产产生一个个错误修修正或改改进性能能的滤波波器的新新版本,但但仍让老老版本3.命名空空间是一

3、一个公司司或作者者进一步步分离过过滤器。例例如,AAdobbe可能能对PSS图象处处理软件件高斯模模糊滤镜镜不同版版本和之之后的效效果,和和使用的的命名空空间中的的领域产产品的名名称来区区分它们们。kerneel GGausssiaanBllur / . 高高斯模糊糊滤镜所所使用的的PS图象象处理软软件kerneel GGausssiaanBllur / . 高高斯模糊糊滤镜所所使用的的后效应应命名空间中中的值与与其他过过滤标识识符的组组合来确确定实际际的命名名空间,因因此不需需要全局局唯一的的。在这一章简简短,只只有内核核名称和和构件截截面显示示;尝试试的例子子,你可可以粘贴贴到内核核内核构

4、构件截面面定义包包含一个个语言版版本的声声明和元元数据段段。核心成员一个内核定定义像CC+中中的类的的成员变变量和成成员函数数,与核核心成员员的部分分包含一一系列的的声明,和和一组函函数定义义。每一一个内核核必须提提供至少少evaaluaateppixeel()功能和和类型的的像素的的至少一一个输出出参数。最简单的PPixeel BBendder程序由由一个内内核,返返回一个个坚实的的色彩无无处不在在:kerneel FFilllWitthBllackkoutpuut ppixeel4 dstt;regioon ggeneeratted()returrn eeverrywhheree();vo

5、id evaaluaatePPixeel()dst = piixell4(00,0,1,00);这个内核产产生一个个输出图图像的四四通道(红红,绿,蓝蓝,),如如通过申申报输出出pixxel44 dsst的定定义。因因为一个个内核的的所有像像素的图图像的每每个像素素执行输输出,输输出参数数定义了了一个完完整的图图。Pixell Beendeer是强强类型语语言。除除了标准准的数字字(标量量)类型型,它定定义了一一组用于于像素,1,2,3的图像向量类型,或4的成员,或通道。作为一个完整的清单和Pixel Bender数据类型的描述,看看Pixel Bender参考。参数和变量量在申明定义义函数前

6、前,你可可以指定定参数,这是通过内核程序和固定的值,依赖变量,使用evaluateDependents()函数,它们仍然是只读,见本教程36页一个核可以以采取任任意数量量的任意意类型的的参数。参参数被传传递到PPixeel BBendder运运行系统统,和它它们的值值在所有有像素的的常数,就就象“均匀”用在三三维着色色语言变变量。应用程序的的内核运运行提供供一个用用户界面面中,用用户可以以设置的的参数值值。例如如,它可可以显示示一个对对话框,当当过滤器器被调用用。在开开发过程程中,PPixeel BBendder工工具包提提供这个个用户界界面。此示例将一一个参数数的fiillwwithhbla

7、ack内内核,它它定义了了一个用用来填充充黑色以以外的其其他颜色色:kerneel FFilllWitthCoolorrparammeteer ppixeel4 collor;outpuut ppixeel4 dstt;regioon ggeneeratted()returrn eeverrywhheree();void evaaluaatePPixeel()dst = coolorr;记住,所有有Pixxel Bennderr程序必必须指定定Pixxel Bennderr核心语语言的版版本他们所写的的,使用用lannguaagevverssionn声明。试试试这个个代码,粘粘贴到一一个内核核

8、程序包含必必要的基基础设施施。参数的数据据类型提提供了一一个线索索,什么么样的控控制主机机的应用用,适当的的参数设设置值。你你通常添添加约束束,有助助于参数数值甚至至更多。例例如,这这个参数数定义允允许用户户界面显显示的最最小值和和最大值值允许的值,以以及初始始默认值值parammeteer ppixeel4 collor ;Pixell Beendeer坐标标系统Pixell Beendeer有一一个单一一的世界界坐标系系统(有有时被称称为世界界空间)。世世界坐标标系是方方形的,均均匀的(各各向同性性,笛卡卡尔,和和正交),和和无限的的。X轴增加加向右,Y轴向下增加输入和输出出图像的的起源是

9、是对齐到到世界坐坐标系的的原点。在Pixeel BBendder模模型,图图像没有有大小。相反,每个图像被认为是定义,在离散的像素无限平面坐标。Pixel Bender运行时引擎执行内核决定需要存储和操作上的像素缓冲区大小。只有个别Pixel Bender有一个尺寸。这Pixeel BBendder坐坐标模型型对滤波波器设计计的影响响。例如如,它是是不可能能写的一一个反映映在其“中心图图像像素素机内核核,“因为中中心是未未定义的的。而不不是,该该中心的的坐标必必须明确确表示通通过它们们作为内内核参数数(参见见“通过在在坐标”在30页)。没有坐标转转换是可可能的;一个是是Traansfformm

10、edbybeiing明明确形象象ressamppleddto thee输出网网格这可可能很严严厉的限限制,但但它怎样样到原子图图像处理理在实践践操作必必须执行行更复杂杂的推理理关于坐坐标系统统,如连连接和重重新排序序顺序执执行的转转换-musst bbeofat ahiggherrlevvel,befforee内核执执行访问的像素素坐标一个核心是是并行执执行的所所有像素素的输出出图像,具具有完全全相同的的参数值值或每个个像素。在在每一像像素的变变化是当当前输出出像素坐坐标唯一一。访问当前坐坐标值,使使用内置置的功能能outtcooord()。这这个函数数返回一一个值ffloaat2型型(两个个

11、浮动向向量),给给出了(x,y)的输出像素的中心坐标被evaluatepixel()功能的当前调用评估。输出电流协调各不相同的图像的像素,但不变的任何一个打电话的寿命期间evaluatepixel()。如果我们假假设像素素的平方方(它们们不一定定;看到到“非正方方形像素素”在33页)的的outtcooord()函数数返回这这些值为为433像素的的图像输输出:下面的示例例是如何演示示outtcooord()函数数,用它它来产生生输出图图像中的的图案。它它也说明明了矢量量型flloatt2使用用和向量量函数llenggth()。Pixxel Bennderr核心语语言包括括一组丰丰富的载载体的类类

12、型和操操作的详详细信息息,参见见;Piixell Beendeer参考考。这个内核提提供一个个(非抗抗锯齿)以以原点为为中心的的实心圆圆,使用用颜色和和半径比比参数:kerneel tt1 paarammeteer ffloaat rradiius; pparaametter pixxel44 coolorr ; iinpuut iimagge4 srcc; ooutpput pixxel44 dsst; vvoidd evvaluuateePixxel() flooat22 cooordd_foor_tthiss_piixell = outtCooord(); flooat curr_raa

13、diuus = leengtth(ccoorrd_ffor_thiis_ppixeel); if (cuur_rradiius rradiius) dsst = coolorr; elsse dsst = saamplleNeeareest(srcc, ccoorrd_ffor_thiis_ppixeel); 通过在坐标标这个内核呈呈现圆一一个指定定的大小小和颜色色,而是是围绕圈圈在原点点,你通通过一个个水平和和垂直的的圆的圆圆心坐标标。kerneel tt1 pparaametter flooat22 ceenteer ; pparaametter flooat raddiuss ; ppa

14、raametter pixxel44 coolorr ; iinpuut iimagge4 srcc; ooutpput pixxel44 dsst; vvoidd evvaluuateePixxel() / wheere aree wee reelattivee too thhe ccentter of thee ciirclle flooat22 cooordd_foor_tthiss_piixell = outtCooord() - ceenteer; flooat curr_raadiuus = leengtth(ccoorrd_ffor_thiis_ppixeel); if (cuu

15、r_rradiius rradiius) dsst = coolorr; elsse dsst = saamplleNeeareest(srcc, ccoorrd_ffor_thiis_ppixeel + ceenteer); 输入图像和和采样一个没有图图像输入入的内核核被称为为源或发发电机。一一个实际际的例子子是一个个程序纹纹理的常常规发电电机。然然而,大大多数内内核需要要一个或或多个图图像输入入。你可以声明明一个或或多个输输入图像像到一个个内核访访问,然然后通过过图像像像素值和和像素坐坐标的内内置采样样功能:samplleNeeareest()返回该像素素的中点点为最近近的给定定的坐标标值

16、samplleLiineaar()双线性插值值四像素素相邻的的给定的的协调执执行简单的可能能的内核核采样叶叶片图像像不变:kerneel IIdenntittyinputt immagee4 ssourrce;outpuut ppixeel4 dstt;void evaaluaatePPixeel()dst = saamplleNeeareest( soourcce, outtCooord() );你能提供任任何坐标标采样功功能;然然而,如如果你的的样本图图像定义义的区域域外的一一点,该该函数返返回透明明黑(00,0,0,0)。所所有的采采样函数数返回完完全相同同的信道道数的像像素值为为通过图

17、图像。非正方形像像素当你认为像像素广场场,一个个图像的的像素网网格总线线与潜在在的世界界坐标空空间:然而,事实实上,像像素不总总是广场场。例如如,作用用通常涉涉及视频频图像具具有非正正方形像像素后。如如果是11.1x 11像素高高,像素素网格不不与世界界线空间间:尽管该像素素的大小小已更改改,所有有的坐标标都仍然然在世界界坐标系系统。例例如,返返回的值值为43像素素的图像像outtcooord()现在在的这个个样子:在内核中,所所有的坐坐标都在在世界坐坐标空间间。这包包括:1、 outcooordd()函函数的返返回值2、 坐标传递到到采样功功能3、 该地区通过过从区域域功能,还还包括nnee

18、dded(),chaangeed(),genneraatedd(),和和dodd()任何参数传传递给内内核,测测量距离离或区域域(如一一个模糊糊半径)也也应该被被指定在在世界坐坐标系。一个核可以以假设,输输出图像像的像素素大小将将作为第第一输入入图像的的像素尺尺寸相同同。除此此之外,然然而,它它不能选选择或制制作的像像素大小小的假设设任何输输入或输输出图像像。所有有的输入入图像和和输出图图像的像像素大小小可以不不同。发发现任何何输入或或输出图图像的像像素大小小,使用用pixxelssizee()和和pixxelaaspeectrratiio()功能。1、内置函函数piixellsizze()返

19、回像像素的大大小对于于一个给给定的输输入或输输出图像像。结果果是测量世界的的像素坐坐标大小小。2、内置函函数piixellasppecttrattio()获取取像素宽宽度除以以像素高高度为一一个给定定的图像pixellAsppecttRattio( i ) = ppixeelSiize( i ).xx / pixxelSSizee( ii ).y一个正方形形的像素素具有11的纵横横比。快讯:在ppixeelsiize()和pixxelaaspeectrratiio()功能的的Flaash Plaayerr可用;然而Flashh播放器器都采用用111像素。如果有可能能,在你你的图像像的像素素不是

20、正正方形的的,你必必须以像像素大小小为帐户来保证证精确的的采样结结果。要要选择相相邻的像像素,例例如,得得到的像像素大小小输入图像和和用它来来修改你你的坐标标,通过过采样函函数。例如,该核核平均每每个像素素与它的的直接的的左和右右的邻居居,产生生一个轻轻微的水平模糊:kerneel HHoriizonntallAveeraggeinputt immagee4 ssourrce;outpuut ppixeel4 ressultt;void evaaluaatePPixeel()floatt2 ccoorrd = ouutCooordd();floatt2 hhOfffsett = flooat2

21、2(piixellSizze(ssourrce).x, 0.0);pixell4 lleftt = saamplleNeeareest(souurcee, ccoorrd - hOOffsset);pixell4 ccentter= saamplleNeeareest(souurcee, ccoorrd);pixell4 rrighht = saamplleNeeareest(souurcee, ccoorrd + hOOffsset);resullt = (lleftt + cennterr + riightt)/33.0;这个例子使使用evvaluuateedeppenddentts()变

22、半径径,已经经提供了了世界坐坐标转换换为半径径测量在在适当大大小的像像素:kerneel tt1 iinpuut iimagge4 srcc; ooutpput pixxel44 dsst; pparaametter flooat raddiuss ; ddepeendeent intt inntRaadiuus; ddepeendeent flooat weiightts 1000 ; vvoidd evvaluuateeDeppenddentts() flooat w = 1.0 / flloatt( rradiius ); flooat s = w / ffloaat( raddiuss

23、 ); inttRaddiuss = intt( cceill( rradiius / ppixeelSiize(srcc).xx ) ); weiightts 0 = w; foor( intt i = 11; ii = inntRaadiuus; +ii ) w -= ss; weiightts i = w; vvoidd evvaluuateePixxel() dstt = sammpleeNeaaresst( srcc, ooutCCoorrd() ) * wweigghtss 00 ; forr( iint i = 1; i = inttRaddiuss; +i ) flloatt

24、x = ffloaat( i ) * pixxelSSizee( ssrc ).xx; dsst += ssamppleNNearrestt( ssrc, ouutCooordd() + ffloaat2( x, 0 ) ) * weiightts i ; dsst += ssamppleNNearrestt( ssrc, ouutCooordd() + ffloaat2( -xx, 00 ) ) * weeighhts i ; 多输入图像像一个核可以以采取任任何数量量的输入入图像,每每一个都都可以有有不同的的通道数数。的下面的内核核乘以一一个单通通道磨砂砂一四图图像通道道kerneel MM

25、attteRGGBAinputt immagee4 ssourrce;inputt immagee1 mmattte;outpuut ppixeel4 ressultt;void evaaluaatePPixeel()pixell4 iin_ppixeel = saamplleNeeareest( soourcce, outtCooord() );pixell1 mmattte_vvaluue = saamplleNeeareest( maattee, ooutCCoorrd() );resullt = inn_piixell * mattte_vallue;使用相关的的值快讯:依赖赖值不可可

26、用时,像像素被用用Flaash播播放器。考考虑一个个程序生生成的查查找表的的像素的的权重的的卷积运运算kerneel tt1 iinpuut iimagge4 souurcee; ooutpput pixxel44 reesullt; vvoidd evvaluuateePixxel() connst flooat siggma = 22.0; flooat c = 1.0 / ( sqrrt(22.0 * 33.1441599265535 ) * siigmaa ); flooat ec = 22.0 * ssigmma * siigmaa; flooat weiightt0 = exxp(

27、 -( 0.00 * 0.00 ) / eec ) * c; flooat weiightt1 = exxp( -( 1.00 * 1.00 ) / eec ) * c; flooat weiightt2 = exxp( -( 2.00 * 2.00 ) / eec ) * c; flooat weiightt3 = exxp( -( 3.00 * 3.00 ) / eec ) * c; flooat weiightt4 = exxp( -( 4.00 * 4.00 ) / eec ) * c; flooat44 accc = flloatt4( 0.00 ); accc += saampll

28、eNeeareest( soourcce, outtCooord() ) * weiightt0; accc += saamplleNeeareest( soourcce, outtCooord() + flloatt2( 1.00, 00.0 ) ) * weiightt1; accc += saamplleNeeareest( soourcce, outtCooord() + flloatt2( -1.0, 0.00 ) ) * weeighht1; accc += saamplleNeeareest( soourcce, outtCooord() + flloatt2( 2.00, 00

29、.0 ) ) * weiightt2; accc += saamplleNeeareest( soourcce, outtCooord() + flloatt2( -2.0, 0.00 ) ) * weeighht2; accc += saamplleNeeareest( soourcce, outtCooord() + flloatt2( 3.00, 00.0 ) ) * weiightt3; accc += saamplleNeeareest( soourcce, outtCooord() + flloatt2( -3.0, 0.00 ) ) * weeighht3; accc += sa

30、amplleNeeareest( soourcce, outtCooord() + flloatt2( 4.00, 00.0 ) ) * weiightt4; accc += saamplleNeeareest( soourcce, outtCooord() + flloatt2( -4.0, 0.00 ) ) * weeighht4; ressultt = accc; 这个代码的的工作但但有一个个问题:查找表表的每一一个像素素的再生生,失败败一个查查找表的的目的。我我们要预预先计算算这些值值一次,然然后运用用他们所所有的像像素。你你可以使使用内核核参数值值传递,但但你需要要外部的的代码来来计

31、算的的值。为了保持计计算内核核中执行行,但只只有一次次,你可可以声明明表一组组相关的的成员变变量。然然后使用用evaaluaateddepeendeentss()函函数来计计算变量量的值。为为初始化化值依赖赖于身体体内的evaluuateedeppenddentts(),这是是运行一一次,在在任何像像素的处处理。然然后这些些值只读读,并且且为evvaluuateepixxel()执行行在所有有像素常常数。这这里有完完整的高高斯模糊糊内核,改改为使用用相关的的变量提示和技巧巧这里有一些些事情要要注意您您的内核核代码设设计未定义的结结果一些内置操操作符和和函数产产生不确确定的结结果,在在某些条条件

32、下,如如除数为为零,或或一个负负数的平平方根。未未定义的的结果会会导致不不可预知知的行为为。内核核完全可可能停止止运行,这这可能生生成黑色色或白色色像素的的像素。它它可能会会产生不不同的运运行不同同的结果果,也可可能产生生不同的的结果在在运行时时的CPPU,GPUU或Flaash播播放器。它它可能出出现在一一个工作作版本,然然后在下下一个版版本失败败。你不不能让你你的内核核在一个个不确定定的方式式使用运运算符或或函数。例例如,如如果你有有一个内内核,并并分,你你必须考考虑到除除数为零零的可能能性。确确保你的的代码的的检测条条件和采采取适当当的行动动不精确的浮浮点运算算浮点运算的的CPUU执行可

33、可能会略略有不同同的结果果来进行行在GPPU,或或在Fllashh Pllayeer中,由由于不同同的优化化和舍入入。这可可能会导导致问题题当比较较平等或或不平等等的浮点点值。你你可以避避免这些些问题更换这样的的代码:if( ff1 = ff2 ) / Doo soometthinng with codde llikee thhis:if( aabs( f11 - f2 ) eppsillon )/ Doo soometthinng 超出范围的的输出像像素值像素值通常常被认为为是在范范围0到1。然而,它它是可能能的,以以一套价价值输出像素是是在此范范围之外外。1、 在GPU运运行时,所有的输出

34、像素值的0至1的范围内夹。2、 在CPU运运行时,输输出像素素值不夹夹建议你写的的内核,同同样在所所有的执执行环境境工作。为为了确保保这一,如如果你的的内核可可能产生生超出范范围的值值,你应应该夹他他们期望望的范围围内,在在你的自自己的代代码。数组的大小小有些老年人人对数组组大小的的限制,他他们可以以处理。注注意,如如果你写写一个内内核使用用数组,它可可能无法法运行在在所有的的GPUU。支持功能快讯:支持持的功能能是不可可用时,使使用Fllashh PllayeerPixxel Bennderr。1、一个核核可以包包含区域域函数的的定义,其其中有预预定义的的名字和和签名,并并提供像像素机运运行

35、时引引擎有多多少空间间的帮助助信息从从这一核核心计算算输出图图像的像像素分配配建筑。有有关详细细信息,参参见4章,“工作区区”2、内核也也可以定定义附加加任意的的支持功功能,它它可以被被称为只只有从eevalluattepiixell()或或evaaluaateddepeendeentss()。区域功能的的例子kerneel RRotaateAAndCCompposiite pparaametter flooat theeta; / 旋转转角度 pparaametter flooat22 ceenteer / 旋旋转中心心 ; ddepeendeent flooat33x3 bacck_xxf

36、orrm; / rottatiion mattrixx (ffromm ddepeendeent flooat33x3 fwdd_xfformm; / aand invversse iinpuut iimagge4 forregrrounnd; iinpuut iimagge4 bacckgrrounnd; ooutpput pixxel44 reesullt; /计算算变换矩矩阵及其其逆矩阵阵(innverrse) vvoidd evvaluuateeDeppenddentts() / traansllatee ceenteer tto ooriggin flooat33x3 traansllatee = flooat33x3( 1, 0, 0, 0, 1, 0,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文献 > 管理手册

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁