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

但是看看我的一个着色器,我有明确的输入/输出参数:

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 脚本工作得很好)。是否有“正确”的方式,或者这两种方式是否完全不同?

4

1 回答 1

1

如您所见,两种方式都有效。但是,我强烈支持使用结构——尤其是对于顶点着色器的输出(片段着色器的输入)。原因与机器喜欢什么无关(它不在乎),而更多地与创建可以在项目和人员之间安全重用和共享的代码有关。您最不想发现和调试的情况是,程序员在某些情况下为 TEXCOORD1 分配了一个值,而在(某些)其他情况下试图从 TEXCOORD2 中读取它。或寄存器不匹配的任何排列。使用结构,你的生活会更好。

于 2012-12-05T00:13:20.047 回答