我有一个顶点着色器,共享在几个像素着色器-GLSLes2.0在iOS上。VS输出变换位置、法线和一组二维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和弦和法线作为输入的PS是很好的,但是那些只取正常的不是。如果我将PS方法签名更改为被uv传递,但不要使用此签名,它是有效的!
这是预期的,明确的行为吗?如果是这样的话,是否有一种方法可以避免将不需要的参数传递给着色器,或者必须创建VS的多个版本?
发布于 2014-02-17 15:00:55
我可以假设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#必须是不中断的顺序(‘TEXCOORD1 0,TEXCOORD1.最重要的是,您应该将TEXCOORD6更改为TEXCOORD1。不管怎么说,如果没有您的代码,很难提出任何建议。当你设置你的着色器时,得到准确的编译错误是很好的。
另外,看一下这个参考来了解更多关于Cg阴影语言的信息:chapter03.html
https://stackoverflow.com/questions/21614085
复制相似问题