0

複数のピクセルシェーダー間で共有される頂点シェーダーがあります-iOSのGLSL ES 2.0。VS は、変換された位置、法線、および 1 セットの 2D uv 座標を出力します。これがその要点です。

void main() {
    vec4 xlt_outPos;
    vec3 xlt_outNormal;
    vec2 xlt_uv0;
    xray_bone_vp( vec4(vertex), vec3(normal), vec2(uv), xlt_outPos, xlt_outNormal, xlt_uv0);
    gl_Position = vec4( xlt_outPos);
    xlv_TEXCOORD6 = vec3( xlt_outNormal);
    xlv_TEXCOORD0 = vec2( xlt_uv0);
}

これは、UV を TEXCOORD0 に出力し、法線に TEXCOORD6 を使用する Cg シェーダに基づいています。

私の問題は、入力として uv 座標法線を取る PS は正常に動作していますが、法線のみを取る PS はそうではないということです。uv を渡すように PS メソッド シグネチャを変更しても、これを使用しない場合は機能します。

これは期待される、明確に定義された動作ですか? もしそうなら、不要なパラメーターをシェーダーに渡したり、VS の複数のバージョンを作成したりすることを避ける方法はありますか?

4

1 に答える 1

1

VS の出力構造と PS の入力が異なると推測できます。正しいコードは次のようになります。

// declare vertex-to-pixel data structure:
struct v_Output {
    float4 position : POSITION;
    float2 texCoord0 : TEXCOORD0;
    float2 texCoord1 : TEXCOORD1;
};

v_Output vertex_shader(...) {
    ...
    return (v_Output)output_data;
}

void pixel_shader(float2 texCoord0 : TEXCOORD0,
                  float2 texCoord1 : TEXCOORD1,
                  out float4 color : COLOR {
    color = ...;
}

そして、いくつかのルールがあります:

  • 頂点シェーダーが生成しないピクセル シェーダー フィールドを要求することはできません
  • TEXCOORD#中断しない順序でなければなりません (`TEXCOORD0, TEXCOORD1...)

何よりも、に変更TEXCOORD6する必要がありますTEXCOORD1。とにかく、コードなしで何かを提案するのは難しいです。また、シェーダーをセットアップするときに正確なコンパイル エラーが発生すると便利です。

また、Cg シェーディング言語の詳細については、次のリファレンスを参照してください: http://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter03.html

于 2014-02-17T15:00:55.567 に答える