在Flash Builder 4 beta中使用Pixel Bender作为数值运算引擎 (六)
通过汇编创建一个kernel
如你所见,使用Pixel Bender Toolkit创建PBJ文件是非常容易的,不过使用汇编语言创建PBJ文件也是可以的。
注意:使用这个技术你需要知道如何编写汇编代码。甚至,这项技术没有支持的工具以及文档化的语法。查看这篇帖子以获取更多信息。
那为什么还要这么做呢?因为使用Pixel Bender Toolkit的同时会带来一些局限。例如,在对音频进行混合的应用中,我们没办法混合两个以上的音频。
当你试图增加第三张图片的时候,你会遇到这样的错误: “This version of Adobe Pixel Bender Toolkit does not support kernel with more than 2 inputs”。另外,你可能想要更好的控制代码以确保它以最高的效率运行。
Tinix Uro项目将一种非官方的汇编和反汇编进行整合,这样你可以使用它来编写汇编代码从而创建PBJ文件。请注意这些代码是不被Adobe官方所支持的。
你可以从这里下载C++代码:
· http://www.kaourantin.net/source/pbjtools/apbj.cpp
· http://www.kaourantin.net/source/pbjtools/dpbj.cpp
在Windows上,你可以下载预编译好的命令行工具:
· http://www.kaourantin.net/source/pbjtools/apbj.zip
· http://www.kaourantin.net/source/pbjtools/dpbj.zip
在Mac OS X上,你将需要自己编译C++代码,输入以下指令来进行编译:
g++ apbj.cpp -o apbj g++ dpbj.cpp -o dpbj
注意:为了使用g++,你需要在Mac系统上安装Xcode suite,它在Gnu编译器集合中。
使用apdj工具,你可以通过汇编代码创建PBJ文件,例如:
./apbj input.pba -o output.pbj
也可以使用dpbj工具来从PBJ文件中反编译得到汇编代码:
./dpbj input.pbj -o output.pba
要使用汇编创建PBJ文件,你首先需要了解PBJ的文件结构。
我使用dpbj反编译了TwoTracksMixer.pbj(该文件是混合音频例子中的)。下面是反编译得到的汇编代码:
version 1 name "sound" kernel "namespace", "elad" kernel "vendor", "Elad Elrom" kernel "version", 1 kernel "description", "track mixer" parameter "_OutCoord", float2, f0.rg, in texture "src0", t0 texture "src1", t1 parameter "dst", float4, f1, out parameter "distort", float, f0.b, in meta "minValue", 0 meta "maxValue", 1 meta "defaultValue", 0.5 ;---------------------------------------------------------- texn f2, f0.rg, t0 mov f3, f2 texn f2, f0.rg, t1 mov f4, f2 mov f2.r, f0.b mov f2.g, f0.b mov f2.b, f0.b mov f2.a, f0.b set f5, 1 sub f5, f2 mov f6, f3 mul f6, f5 mov f7, f4 mul f7, f2 add f6, f7 mov f1, f6
代码的第一部分是kernel的定义,就像Pixel Bender Toolkit中定义元数据一样:
version 1 name "sound" kernel "namespace", "elad" kernel "vendor", "Elad Elrom" kernel "version", 1 kernel "description", "track mixer"
第二部分定义了输入、输出和参数
下面的两行texture定义了图像源文件
texture "src0", t0 texture "src1", t1
Kernel中可以有不限数量的任意类型的参数。定义参数的时候你也要提供元数据,比如minimum(最小值),maxmum(最大值)和default values(默认值)。你可以通过使用不同的通道在一个寄存器中储存多个参数。例如, _OutCoord在“0”寄存器的R(red)和G(green)通道中存储了像素位置(X,Y)。其他的参数则可以使用B(blue)和A(alpha)通道。
parameter "_OutCoord", float2, f0.rg, in … parameter "distort", float, f0.b, in
每一个参数又含有三个定义参数
· 参数的类型;
· 寄存器,申明从哪里访问该参数
· 输入还是输出,定义该参数是输入参数还是输出参数
有四个元数据的值你可以设定:
minValue(最小值), maxValue(最大值),defaultValue(默认值),和 description(描述)。比如:
parameter "distort", float, f0.b, in meta "minValue", 0 meta "maxValue", 1 meta "defaultValue", 0.5
代码的最后一部分包含了一些用来进行具体操作的指令。比如, mov 用来将一个值放入一个寄存器,mul 用来对数值进行乘法操作,sub 用来将数值相加。
texn f2, f0.rg, t0 mov f3, f2 texn f2, f0.rg, t1 mov f4, f2 mov f2.r, f0.b mov f2.g, f0.b mov f2.b, f0.b mov f2.a, f0.b set f5, 1 sub f5, f2 mov f6, f3 mul f6, f5 mov f7, f4 mul f7, f2
如果你编写汇编代码很熟练,你可以对你的代码进行优化调整,然后使用apbj工具创建一个新的质量更高的PBJ文件。 这也为使用Pixel Bender进行更加复杂的运算提供了更多的可能。
从哪里获取更多信息
本文只是对使用Pixel Bender进行数值运算进行了一个简单的介绍。
请查看下面的资源以获取更多相关信息:
· Pixel Bender basics for Flash
· A Pixel Bender assembler that uses haXe
· James Ward’s ActionScript 3.0 Pixel Bender Shader Library

.gif)
.gif)




.gif)
发表新评论