1

有人能告诉我这两个片段着色器有什么区别吗:

// 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)以上在实践中所做的是,它覆盖了每个三角形的各个 alpha 设置。我想要的是将它自己的 alpha 与着色器相乘,这样最终的 alpha 值将是 = Triangle_alpha * Shader_alpha

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

4

1 回答 1

2

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

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

将片段 RGBA 乘以存储在可变寄存器 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 值。在将它们与片段 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 值从顶点着色器传递到片段着色器,您可以在其中使用它。

于 2012-08-31T18:30:31.623 回答