有人能告诉我这两个片段着色器之间的区别是什么:
// 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>
答案 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值传递给片段着色器,在那里你可以使用它。