AGAL(Adobe Graphics Assembly Language) 语言是Adobe 公司为stage3D 开发一门图形渲染语言,类似 Opengl Shader Language.
AGAL有30个指令,并不复杂. 只要熟练掌握这30个指令的使用方式,以及如果将程序参数传入AGAL,以及从AGAL中输出参数,就可以入门编写自己想要的效果了.
在寄存器中 有128个存储临时变量的地方 v0-v127
现在针对一个最简单的 AGAL shader 程序,来看看如何操作
[cc lang=”actionscript3″ nowrap=”false”]
var fragmentShaderAssembler : AGALMiniAssembler = new AGALMiniAssembler();
fragmentShaderAssembler.assemble(Context3DProgramType.FRAGMENT,
“mov oc, v2n”
);
[/cc]
这个操作是将 v2 中的变量输出到 oc 中.
[cc lang=”actionscript3″ nowrap=”false”]
meshIndexData = Vector.
[0,1,2, 0,2,3]
);
meshVertexData = Vector.
[ -1,-1,1, 0,0, 0,0,1, 1.0,0.0,0.0,1.0,
1,-1,1, 1,0, 0,0,1, 0.0,1.0,0.0,1.0,
1,1,1, 1,1, 0,0,1, 0.0,0.0,1.0,1.0,
-1,1,1, 0,1, 0,0,1, 1.0,1.0,1.0,1.0
]);
[/cc]
这个操作构造了2个三角形,IndexData 为三角形要用到的顶点索引位, VertexData 为顶点数据
[cc lang=”actionscript3″ nowrap=”false”]
//rgba
context3D.setVertexBufferAt(2, vertexBuffer, 8, Context3DVertexBufferFormat.FLOAT_4);
[/cc]
将rgba的数值传入渲染.
setVertexBufferAt 的第一个参数就是要使用的 临时寄存器位置, 2 表示 使用v2(0-7). vertexBuffer 为数据, 8 表示要使用的数据是从 VertexData 顶点数据中第8位开始的 即 “1.0,0.0,0.0,1.0”, 最后一个参数是 FLOAT_4 即要使用的数据类型,它表示我们要使用一个4位的浮点型,rgba有4位,如果你传入的是顶点数据x,y,z, 那么你应该使用的是 FLOAT_3 . 对于rgba来说,他们是不可能出现负数的,这意味着你使用BYTES_4 也是可行的,而且最好这么使用.
试着让一个自定义的材质呈现不同颜色
在 agal 中要渲染一个材质的话,需要如下shader
[cc lang=”actionscript3″ nowrap=”false”]
var fragmentShaderAssembler : AGALMiniAssembler = new AGALMiniAssembler();
fragmentShaderAssembler.assemble(Context3DProgramType.FRAGMENT,
“tex ft0, v1, fs0 <2d,repeat,miplinear>n” +
“mov oc, ft0n”
);
[/cc]
“tex ft0, v1, fs0 <2d,repeat,miplinear>n” 指从 fs0 的地方取得材质, 从 v1 的地方取得 坐标系, 然后将他们存入 ft0
“mov oc, ft0n” 将 ft0 的数据输出
那么怎么给 fs0 和 v1 赋值呢?
fs0 赋值方式为 context3D.setTextureAt(0,myTexture);
v1 赋值方式为 context3D.setVertexBufferAt(1, vertexBuffer, 3, Context3DVertexBufferFormat.FLOAT_2); v1 的数据就只之前的 meshData 从第三位开始的 U,V 数据.
从上面的agal代码中,我们将材质的颜色仅仅是重现而已,并没有让它呈现不同颜色,接下来,我们来常识实现变色
shader如下
[cc lang=”actionscript3″ nowrap=”false”]
var fragmentShaderAssembler3 : AGALMiniAssembler = new AGALMiniAssembler();
fragmentShaderAssembler3.assemble(Context3DProgramType.FRAGMENT,
“tex ft0, v1, fs0 <2d,repeat,miplinear>n” +
“mul ft1, v2, ft0n” +
“mov oc, ft1n”
);
[/cc]
这个shader程序仅仅比之前多一行
“mul ft1, v2, ft0n” 的操作为 对于材质的每一个像素 都乘以 从v2中获取的rgba参数,并将结果存入 ft1
“mov oc, ft1n” 将这些参数输出
如果不是针对每一个像素,而是让整个材质呈现同一种颜色.
只需要将第二句改变为 “mul ft1, fc0, ft0n”
fc0 的赋值方式为 context3D.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT,0,Vector.
最后整理一下AS3.0 中 API的解释,以及所有寄存器的定义,最后是30个寄存器列表
Continue reading