您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 人事档案/员工关系 > PixelBender开发人员指南
PixelBender工具包概述开始编写PixelBender滤镜本章讨论PixelBender语言编写的特殊功能。一个内核部分在PixelBender图像处理的基本单位是内核。每个像素机核心语言程序定义了一个内核,由一个单一的字符串,包含语言版本的内核语句中指定的元素。languageVersion:1.0;所需要的语言版本的元素kernelnamekernelmetadatapairs在尖括号中的元数据部分{kernelmembers变量和函数包括在这对花括号内}内核语句包含一个名字,一组元数据的方括号中,描述了内核,和一组成员的花括号括起来的定义的过滤操作内核的数据元素每一个内核定义之前需要的语言版本的元素。这个声明和元数据部分(可以修改)被提供时自动创建在PixelBender工具包IDE的一个新的过滤器。元数据部分提供命名空间,内核版本,和其他的识别和描述信息。这是特别重要的是当你收集的几个内核的图形来执行更复杂的操作。比如说呢。namespace:Tutorial;vendor:Adobe;version:1;description:MyFilter;命名空间,供应商,和版本值是必需的;说明是可选的。1.供应商的公司或个人谁写的筛选器名称。2.他是一个版本的整数版本号应该开始在1增加了新的内核版本。这允许你产生一个错误修正或改进性能的滤波器的新版本,但仍让老版本3.命名空间是一个公司或作者进一步分离过滤器。例如,Adobe可能对PS图象处理软件高斯模糊滤镜不同版本和之后的效果,和使用的命名空间中的领域产品的名称来区分它们。kernelGaussianBlurnamespace:Photoshop;vendor:AdobeSystems;version:1;{//...高斯模糊滤镜所使用的PS图象处理软件}kernelGaussianBlurnamespace:AfterEffects;vendor:AdobeSystems;version:1;{//...高斯模糊滤镜所使用的后效应}命名空间中的值与其他过滤标识符的组合来确定实际的命名空间,因此不需要全局唯一的。在这一章简短,只有内核名称和构件截面显示;尝试的例子,你可以粘贴到内核内核构件截面定义包含一个语言版本的声明和元数据段。核心成员一个内核定义像C++中的类的成员变量和成员函数,与核心成员的部分包含一系列的声明,和一组函数定义。每一个内核必须提供至少evaluatepixel()功能和类型的像素的至少一个输出参数。最简单的PixelBender程序由一个内核,返回一个坚实的色彩无处不在:kernelFillWithBlack...{outputpixel4dst;regiongenerated(){returneverywhere();}voidevaluatePixel(){dst=pixel4(0,0,1,0);}}这个内核产生一个输出图像的四通道(红,绿,蓝,α),如通过申报输出pixel4dst的定义。因为一个内核的所有像素的图像的每个像素执行输出,输出参数定义了一个完整的图。PixelBender是强类型语言。除了标准的数字(标量)类型,它定义了一组用于像素,1,2,3的图像向量类型,或4的成员,或通道。作为一个完整的清单和PixelBender数据类型的描述,看看PixelBender参考。参数和变量在申明定义函数前,你可以指定参数,这是通过内核程序和固定的值,依赖变量,使用evaluateDependents()函数,它们仍然是只读,见本教程36页一个核可以采取任意数量的任意类型的参数。参数被传递到PixelBender运行系统,和它们的值在所有像素的常数,就象“均匀”用在三维着色语言变量。应用程序的内核运行提供一个用户界面中,用户可以设置的参数值。例如,它可以显示一个对话框,当过滤器被调用。在开发过程中,PixelBender工具包提供这个用户界面。此示例将一个参数的fillwithblack内核,它定义了一个用来填充黑色以外的其他颜色:kernelFillWithColor...{parameterpixel4color;outputpixel4dst;regiongenerated(){returneverywhere();}voidevaluatePixel(){dst=color;}}记住,所有PixelBender程序必须指定PixelBender核心语言的版本他们所写的,使用languageversion声明。试试这个代码,粘贴到一个内核程序包含必要的基础设施。参数的数据类型提供了一个线索,什么样的控制主机的应用,适当的参数设置值。你通常添加约束,有助于参数值甚至更多。例如,这个参数定义允许用户界面显示的最小值和最大值允许的值,以及初始默认值parameterpixel4colorminValue:float4(0.0,0.0,0.0,0.0);maxValue:float4(1.0,1.0,1.0,1.0);defaultValue:float4(0.0,0.0,0.0,1.0);;PixelBender坐标系统PixelBender有一个单一的世界坐标系统(有时被称为世界空间)。世界坐标系是方形的,均匀的(各向同性,笛卡尔,和正交),和无限的。X轴增加向右,Y轴向下增加输入和输出图像的起源是对齐到世界坐标系的原点。在PixelBender模型,图像没有大小。相反,每个图像被认为是定义,在离散的像素无限平面坐标。PixelBender运行时引擎执行内核决定需要存储和操作上的像素缓冲区大小。只有个别PixelBender有一个尺寸。这PixelBender坐标模型对滤波器设计的影响。例如,它是不可能写的一个反映在其“中心图像像素机内核,“因为中心是未定义的。而不是,该中心的坐标必须明确表示通过它们作为内核参数(参见“通过在坐标”在30页)。没有坐标转换是可能的;一个是Transformedbybeing明确形象resampledtothe输出网格这可能很严厉的限制,但它怎样到原子图像处理在实践操作必须执行更复杂的推理关于坐标系统,如连接和重新排序顺序执行的转换-mustbeofatahigherlevel,before内核执行访问的像素坐标一个核心是并行执行的所有像素的输出图像,具有完全相同的参数值或每个像素。在每一像素的变化是当前输出像素坐标唯一。访问当前坐标值,使用内置的功能outcoord()。这个函数返回一个值float2型(两个浮动向量),给出了(x,y)的输出像素的中心坐标被evaluatepixel()功能的当前调用评估。输出电流协调各不相同的图像的像素,但不变的任何一个打电话的寿命期间evaluatepixel()。如果我们假设像素的平方(它们不一定;看到“非正方形像素”在33页)的outcoord()函数返回这些值为4×3像素的图像输出:下面的示例是如何演示outcoord()函数,用它来产生输出图像中的图案。它也说明了矢量型float2使用和向量函数length()。PixelBender核心语言包括一组丰富的载体的类型和操作的详细信息,参见;PixelBender参考。这个内核提供一个(非抗锯齿)以原点为中心的实心圆,使用颜色和半径比参数:languageVersion:1.0;kernelt1namespace:test.t;vendor:my;version:1;{parameterfloatradiusminValue:0.0;maxValue:600.0;defaultValue:100.0;;parameterpixel4colorminValue:float4(0.0,0.0,0.0,0.0);maxValue:float4(1.0,1.0,1.0,1.0);defaultValue:float4(0.0,0.0,0.0,1.0);;inputimage4src;outputpixel4dst;voidevaluatePixel(){float2coord_for_this_pixel=outCoord();floatcur_radius=length(coord_for_this_pixel);if(cur_radiusradius){dst=color;}else{dst=sampleNearest(src,coord_for_this_pixel);}}}通过在坐标这个内核呈现圆一个指定的大小和颜色,而是围绕圈在原点,你通过一个水平和垂直的圆的圆心坐标。languageVersion:1.0;kernelt1namespace:test.t;vendor:my;version:1;{parameterfloat2centerminValue:float2(0);maxValue:float2(500);defaultValue:float2(180);;parameterfloatradiusminValue:0.0;maxValue:100.0;defaultValue:30.0;;parameterpixel4colorminValue:float4(0.0,0.0,0.0,0.0);maxValue:float4(1.0,1.0,1.0,1.0);defaultValue:float4(0.0,0.0,0.0,1.0);;inputimage4src;outputpixel4dst;voidevaluatePixel(){//wherearewerelativetothecenterofthecirclefloat2coord_for_this_pixel=outCoord()-center;floatcur_radius=length(coord_for_this_pixel);if(cur_radiusradius){dst=color;}else{dst=sampleNearest(src,coord_for_this_pixel+center);}}}输入图像和采样一个没有图像输入的内核被称为源或发电机。一个实际的例子是一个程序纹理的常规发电机。然而,大多数内核需要一个或多个图像输入。你可以声明一个或多个输入图像到一个内核访问,然后通过图像像素值和像素坐标的内置采样功能:sampleNearest()返回该像素的中点为最近的给定的坐标值sampleLinear()双线性插值四像素相邻的给定的协调执行简单的可能的内核采样叶片图像不变:kernelIdentity...{inputimage4source;outputpixel4dst;voidevaluatePixel(){dst=sampleNearest(source,outCoord());}}你能提供任何坐标采样功能;然而,如果你的样本图像定义的区域外的一点,该函数返回透明黑(0,0,0,0)。所有的采样函数返回完全相同的信道数的像素值为通过图像。非正方形像素当你认为像素广场,一个图像的像素网格总线与潜在的世界坐标空间:然而,事实上,像素不总是广场。例如,作用通常涉及视频图像具有非正方形像素后。如果是1.1x1像素高,像素网格不与世界线空间:尽管该像素的大小已更改,所有的坐标都仍然在世界坐标系统。例如,返回的值为4×3像素的图像outcoord()现在的这个样子:在内核中,所有的坐标都在世界坐标空间。这包括:1、outcoord()函数的返回值2、坐标传递到采样功能3、该地区通过从区域功能,还包括needed(),changed(),generated(),和dod()任何参数传递给内核,测量距离或区域(如一个模糊半径)也应该被指定在世界坐标系。一个核可以假设,输出图像的像素大小将作为第一输入图像的像素尺寸相同。除此之外,然而,它不能选择或制作的像素大小的假设任何输入或输出图像。所有的输入图像和输出图像的像素大小可以不同。发
本文标题:PixelBender开发人员指南
链接地址:https://www.777doc.com/doc-1013881 .html