构建Cg程序的正确方法是什么?

时间:2012-10-29 17:00:36

标签: opengl-es-2.0 shader cg hlsl2glsl

This tutorial使用显式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脚本工作正常)。是否有“正确”的方式,或者是两种完全不同的方式来达到同一目的?

1 个答案:

答案 0 :(得分:1)

正如您所见,两种方式都有效。但是,我强烈赞同使用结构 - 尤其是顶点着色器的输出(片段着色器的输入)。原因与机器喜欢的东西(它不关心)有关,而更多的是与创建可以在项目和人之间安全地重复使用和共享的代码。你想要查找和调试的最后一件事是一个程序员在某些情况下为TEXCOORD1分配了一个值,并试图在(某些)其他情况下从TEXCOORD2读取它。或者寄存器不匹配的任何排列。使用结构,你的生活会更好。