Pixel Bender工具包概述
开始
编写Pixel Bender滤镜
本章讨论Pixel Bender语言编写的特殊功能。
一个内核部分
在Pixel Bender图像处理的基本单位是内核。每个像素机核心语言程序定义了一个内核,由一个单一的字符串,包含语言版本的内核语句中指定的元素。
kernel metadata pairs ?在尖括号中的元数据部分 > {
kernel members
?变量和函数包括在这对花括号内
}
内核语句包含一个名字,一组元数据的方括号中,描述了内核,和一组成员的花括号括起来的定义的过滤操作
内核的数据元素
每一个内核定义之前需要的语言版本的元素。这个声明和元数据部分(可以修改)被提供时
自动创建在Pixel Bender工具包IDE的一个新的过滤器。
元数据部分提供命名空间,内核版本,和其他的识别和描述信息。这是特别重要的是当你收集的几个内核的图形来执行更复杂的操作。比如说呢。 <
namespace : \vendor : \version : 1;
description: \ >
命名空间,供应商,和版本值是必需的;说明是可选的。 1.供应商的公司或个人谁写的筛选器名称。
2.他是一个版本的整数版本号应该开始在1增加了新的内核版本。这允许你产生一个错误修正或改进性能的滤波器的新版本,但仍让老版本
3.命名空间是一个公司或作者进一步分离过滤器。例如,Adobe可能对PS图象处理软件高斯模糊滤镜不同版本和之后的效果,和使用的命名空间中的领域产品的名称来区分它们。 kernel GaussianBlur <
namespace : \ vendor : \ version : 1; > {
// ... 高斯模糊滤镜所使用的
PS图象处理软件
}
kernel GaussianBlur <
namespace : \ vendor : \ version : 1; > {
// ... 高斯模糊滤镜所使用的后效应 }
命名空间中的值与其他过滤标识符的组合来确定实际的命名空间,因此不需要全局唯一的。 在这一章简短,只有内核名称和构件截面显示;尝试的例子,你可以粘贴到内核内核构件截面定义包含一个语言版本的声明和元数据段。
核心成员
一个内核定义像C++中的类的成员变量和成员函数,与核心成员的部分包含一系列的声明,和一组函数定义。每一个内核必须提供至少evaluatepixel()功能和类型的像素的至少一个输出参数。
最简单的Pixel Bender 程序由一个内核,返回一个坚实的色彩无处不在: kernel FillWithBlack < ... > {
output pixel4 dst; region generated() {
return everywhere(); }
void evaluatePixel() {
dst = pixel4(0,0,1,0); } }
这个内核产生一个输出图像的四通道(红,绿,蓝,α),如通过申报输出pixel4 dst的定义。因为一个内核的所有像素的图像的每个像素执行输出,输出参数定义了一个完整的图。 Pixel Bender是强类型语言。除了标准的数字(标量)类型,它定义了一组用于像素,1,2,3的图像向量类型,或4的成员,或通道。作为一个完整的清单和Pixel Bender数据类型的描述,看看Pixel Bender参考。
参数和变量
在申明定义函数前,你可以指定参数,这是通过内核程序和固定的值,依赖变量,使用evaluateDependents()函数,它们仍然是只读,见本教程36页
一个核可以采取任意数量的任意类型的参数。参数被传递到Pixel Bender运行系统,和它们的值在所有像素的常数,就象“均匀”用在三维着色语言变量。
应用程序的内核运行提供一个用户界面中,用户可以设置的参数值。例如,它可以显示一个对话框,当过滤器被调用。在开发过程中,Pixel Bender工具包提供这个用户界面。 此示例将一个参数的fillwithblack内核,它定义了一个用来填充黑色以外的其他颜色: kernel FillWithColor < ... > {
parameter pixel4 color; output pixel4 dst; region generated() {
return everywhere(); }
void evaluatePixel() {
dst = color; } }
记住,所有Pixel Bender程序必须指定Pixel Bender核心语言的版本 他们所写的,使用languageversion声明。试试这个代码,粘贴到一个内核 程序包含必要的基础设施。
参数的数据类型提供了一个线索,什么样的控制主机的应用,适当的参数设置值。你通常添加约束,有助于参数值甚至更多。例如,这个参数定义允许用户界面显示的最小值和最大值 允许的值,以及初始默认值
parameter pixel4 color <
minValue: 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); >;
Pixel Bender坐标系统
Pixel Bender有一个单一的世界坐标系统(有时被称为世界空间)。世界坐标系是方形的,均匀的(各向同性,笛卡尔,和正交),和无限的。X轴增加向右,Y轴向下增加 输入和输出图像的起源是对齐到世界坐标系的原点。
在Pixel Bender模型,图像没有大小。相反,每个图像被认为是定义,在离散的像素无限平面坐标。Pixel Bender运行时引擎执行内核决定需要存储和操作上的像素缓冲区大小。只有个别Pixel Bender有一个尺寸。
这Pixel Bender坐标模型对滤波器设计的影响。例如,它是不可能写的一个反映在其“中心图像像素机内核,“因为中心是未定义的。而不是,该中心的坐标必须明确表示通过它们作为内核参数(参见“通过在坐标”在30页)。
没有坐标转换是可能的;一个是Transformed by being明确形象resampled to the输出网格这可能很严厉的限制,但它怎样到原子图像处理在实践操作必须执行更复杂的推理关于坐标系统,如连接和重新排序顺序执行的转换- must be of at a higher level,before内核执行
访问的像素坐标
一个核心是并行执行的所有像素的输出图像,具有完全相同的参数值或每个像素。在每一像素的变化是当前输出像素坐标唯一。
访问当前坐标值,使用内置的功能outcoord()。这个函数返回一个值float2型(两个浮动向量),给出了(x,y)的输出像素的中心坐标被evaluatepixel()功能的当前调用评估。输出电流协调各不相同的图像的像素,但不变的任何一个打电话的寿命期间evaluatepixel()。 如果我们假设像素的平方(它们不一定;看到“非正方形像素”在33页)的outcoord()函数返回这些值为4×3像素的图像输出:
下面的示例是如何演示outcoord()函数,用它来产生输出图像中的图案。它也说明了矢量型float2使用和向量函数length()。Pixel Bender核心语言包括一组丰富的载体的类型和操作的详细信息,参见;Pixel Bender参考。
相关推荐: