我有一个顶点着色器,在几个像素着色器之间共享 - 在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的多个版本?
答案 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