1

これら 2 つのフラグメント シェーダーの違いを教えてください。

// 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" 

アルファを掛ける 2 行目だけが異なります。その結果、2 番目のシェーダー (Node2D) では、setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, 0, [1,1,1,1]);を介してマスター アルファ値を渡すことができます。これにより、すべての三角形がそのアルファで描画されます。

1)誰かがその 2 行目で何が起こっているか教えてもらえますか?

2)上記が実際に行うことは、各三角形の個々のアルファ設定をオーバーライドすることです。代わりに、独自のアルファをシェーダーのアルファと 乗算して、最終的なアルファ値が= Triangle_alpha * Shader_alphaになるようにします。

(現在、2番目のシェーダーで特定の三角形に個別のアルファ値を設定することはできません。私が望むのは、各三角形に個別にアルファ値を設定し、 drawTriangles 呼び出し全体にも別のアルファ値を設定できるようにすることです)

4

1 に答える 1

2

元の回答が正しくなかったので、回答を修正したいと思います。

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

可変レジスタ 0 に格納されている値の 3 番目のコンポーネントでフラグメント RGBA を乗算しています。これはおそらく、頂点シェーダーからフラグメント シェーダーに渡された頂点座標です。この線により、カメラから遠くなるほど色が明るくなります。

"mul ft0, ft0, fc0\n"

フラグメント RGBA に、フラグメント定数 0 にアップロードされた RGBA 値を掛けます。定数の色が明るい/透明であるほど、最終的な値は明るく/透明になります。

アルファのみを変更したい場合は、次を試すことができます。

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

アルファを結合したい場合は、乗算する代わりに追加してみてください。

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

各頂点にアルファ コンポーネントを配置することで、三角形ごとに個別のアルファ値を指定できます。これらの値をフラグメント アルファと組み合わせる前に、定数に格納できる「グローバル」アルファと組み合わせることができます。唯一の問題は、頂点のアルファ値が異なる場合、頂点を複製する必要があることです。

したがって、三角形の例の頂点は次のようになります。

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);

次に、Varying Register を介して Vertex Shader から Fragment Shader にアルファ値を渡し、そこで利用できます。

于 2012-08-31T18:30:31.623 に答える