GLSL ES Pixel Shader仅在传入未使用的texcoords时有效

时间:2014-02-06 21:09:48

标签: shader glsles hlsl2glsl

我有一个顶点着色器,在几个像素着色器之间共享 - 在iOS上的GLSL ES 2.0。 VS输出转换位置,法线和一组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);
}

这是基于一个Cg着色器,它将uv输出到TEXCOORD0并使用TEXCOORD6作为法线。

我的问题是,将uv coords 正常作为输入的PS工作正常,但那些仅采用普通 的PS则不行。如果我改变PS方法签名要传递uv但不使用它,它就可以了!

这是预期的,明确定义的行为吗?如果是这样,有没有办法避免将不需要的参数传递给着色器或者必须创建VS的多个版本?

1 个答案:

答案 0 :(得分: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