AGAL / Stage3D:在一个着色器中重叠2个纹理

时间:2013-04-08 08:11:55

标签: actionscript-3 flash shader agal

我设法让alpha工作,但我想只在一个纹理上更改alpha。目前它只适用于两者。我设置了深度测试和混合因子:

context3D.setDepthTest(false, Context3DCompareMode.LESS);
context3D.setBlendFactors(Context3DBlendFactor.SOURCE_ALPHA, Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA);

我还没弄明白,究竟是什么来源和说法,任何澄清都会很好。 顶点数据包含

[x, y, z, u, v, 0|1]

设置顶点寄存器

context3D.setVertexBufferAt(0, m_vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_3);
context3D.setVertexBufferAt(1, m_vertexBuffer, 3, Context3DVertexBufferFormat.FLOAT_2);
context3D.setVertexBufferAt(2, m_vertexBuffer, 5, Context3DVertexBufferFormat.FLOAT_1);

设置片段常量

context3D.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, 0, Vector.<Number>([textureMul, 0, 0, 0]));

顶点着色器

m44 op, va0, vc0
mov v0, va1
mov v1, va2

片段着色器

tex ft0, v0, fs0 <2d,clamp,linear>
sub ft0.w, ft0.w, fc0.x
add ft0.w, ft0.w, v1
mov oc, ft0

其中fc0.x是0到1之间的数字.v1是0或1。

1 个答案:

答案 0 :(得分:0)

感谢God for Windows for PIX program(Microsoft DirectX SDK附带)。我明白了如何正确使用FLOAT。由于我将v1作为FLOAT_1传递,我必须使用v1.x,因此右片段着色器将是

tex ft0, v0, fs0 <2d,clamp,linear>
sub ft0.w, ft0.w, fc0.x
add ft0.w, ft0.w, v1.x
mov oc, ft0