3

このチュートリアルでは、明示的なOUT構造を使用します。例:

struct C3E1v_Output {
  float4 position : POSITION;
  float4 color    : COLOR;
};

C3E1v_Output C3E1v_anyColor(float2 position : POSITION,
                            uniform float4 constantColor)
{
  C3E1v_Output OUT;
  OUT.position = float4(position, 0, 1);
  OUT.color = constantColor;  // Some RGBA color
  return OUT;
}

しかし、私のシェーダーの1つを見ると、明示的な入力/出力パラメーターがあります。

float4 slice_vp(
        // Vertex Inputs
        in float4 position        : POSITION,    // Vertex position in model space
      out float4 oposition : POSITION,
        // Model Level Inputs
        uniform float4x4 worldViewProj) : TEXCOORD6
{
    // Calculate output position
    float4 p = mul(worldViewProj, position);
    oposition=p;
    return p;
}

これでHLSL2GLSLを使用する際に問題が発生し、Cg形式が原因であるかどうか疑問に思いました(Cgスクリプトとしては正常に機能しますが)。「正しい」方法はありますか、それとも同じ目的のための2つの単純に異なる方法ですか?

4

1 に答える 1

1

見てきたように、両方の方法が機能します。ただし、特に頂点シェーダーの出力 (フラグメント シェーダーの入力) では、構造体を使用することを強くお勧めします。その理由は、マシンが好むもの (気にしない) とは関係がなく、安全に再利用でき、プロジェクトや人々の間で共有できるコードを作成することに関係しています。最後に見つけてデバッグする必要があるのは、あるプログラマーが TEXCOORD1 に値を代入し、他の (いくつかの) 場合に TEXCOORD2 から値を読み込もうとしている場合です。または、レジスタの不一致の順列。構造体を使用すると、あなたの人生はより良くなります。

于 2012-12-05T00:13:20.047 に答える