AS3 Stage3D片段着色器?

时间:2012-08-31 12:33:31

标签: actionscript-3 assembly fragment-shader stage3d

有人能告诉我这两个片段着色器之间的区别是什么:

// Adobe's GPUSprite Fragment Shader 
"tex ft0, v0, fs0 <2d,clamp,linear,mipnearest> \n" + 
"mul ft0, ft0, v0.zzzz\n" +  // multiply with alpha?? 
"mov oc, ft0 \n"

// Node2D Fragment Shader 
"tex ft0, v0, fs0 <2d,clamp,linear,mipnearest> \n" + 
"mul ft0, ft0, fc0\n" + // this line is different
"mov oc, ft0 \n" 

只有第二行不同,我们将它与alpha相乘。 因此,第二个着色器(Node2D)允许您通过 setProgramConstantsFromVector(Context3DProgramType.FRAGMENT,0,[1,1,1,1]); 调用传入主alpha值,其中将导致使用该alpha绘制所有三角形。

1)有人可以告诉我第二行发生了什么事吗?

2)以上在实践中的作用是 覆盖 每个triange的各个alpha设置。我想要的是使用着色器 乘以 它自己的alpha,以便最终的alpha值为 = Triangle_alpha * Shader_alpha 。< / p>

(因为现在我无法使用第二个着色器为特定三角形设置单独的alpha值。我想要的是能够分别为每个三角形设置一个alpha值,并为整个drawTriangles调用设置另一个) / p>

1 个答案:

答案 0 :(得分:2)

我想修改我的答案,因为原件不正确。

"mul ft0, ft0, v0.zzzz\n"

将片段RGBA乘以存储在Varying Register 0中的值的第三个分量。这可能是从顶点着色器传递到片段着色器的顶点坐标。这条线应该使颜色变亮,离相机越远。

"mul ft0, ft0, fc0\n"

将片段RGBA乘以上传到片段常量0中的RGBA值。常量中颜色越亮/越透明,最终值越亮/越透明。

如果您只想更改Alpha,可以尝试:

"mul ft0.a, ft0.a, fc0.a\n"

如果你想组合alpha,你可以尝试添加而不是乘法。

"add ft0.a, ft0.a, fc0.a\n"

您可以通过在每个顶点中放置一个alpha分量为每个三角形指定单独的Alpha值。在将它们与Fragment Alpha组合之前,您可以将这些值与可以存储在常量中的“全局”alpha结合起来。唯一的问题是,如果顶点具有不同的alpha值,则必须复制顶点。

因此,示例三角形的顶点将来自:

var vertices:Vector.<Number> = Vector.<Number>([
    //x, y, z, w,
    0, 0, 0, 0,
    1, 0, 0, 0,
    0, 1, 0, 0,
]);

vertexBuffer:VertexBuffer3D = context3D.createVertexBuffer(3, 4);
vertexBuffer.uploadFromVector(vertices, 0, 3);

为:

var vertices:Vector.<Number> = Vector.<Number>([
    //x, y, z, w, a
    0, 0, 0, 0, 0.5,
    1, 0, 0, 0, 0.5,
    0, 1, 0, 0, 0.5,
]);

vertexBuffer:VertexBuffer3D = context3D.createVertexBuffer(3, 5);
vertexBuffer.uploadFromVector(vertices, 0, 3);

然后你可以通过变量寄存器将顶点着色器中的alpha值传递给片段着色器,在那里你可以使用它。