OpenGL/GLSL中顶点着色器省略未使用输出导致输出损坏问题
我在顶点着色器中接收三个属性并传递给片段着色器,如果省略一个片段着色器完全未使用的特定通道,片段着色器会产生无效输出。
我将代码精简为以下简单示例:
A.(正确)
//Vertex Shader GLSL #version 140 in vec3 a_Position; in uvec4 a_Joint0; in vec4 a_Weight0; // it doesn't matter if flat is specified or not for the joint0 (apparently) // out uvec4 o_Joint0; flat out vec4 o_Joint0; flat out vec4 o_Weight0; layout (std140) uniform WorldParams { mat4 ModelMatrix; }; void main() { o_Joint0=a_Joint0; o_Weight0=a_Weight0; vec4 pos = ModelMatrix * vec4(a_Position, 1.0); gl_Position = pos; }
//Fragment Shader GLSL #version 140 flat in uvec4 o_Joint0; flat in vec4 o_Weight0; out vec4 f_FinalColor; void main() { f_FinalColor=vec4(0,0,0,1); f_FinalColor.rgb += (o_Weight0.xyz + 1.0) / 4.0+(o_Weight0.z + 1.0) / 4.0; }
顶点着色器将o_Joint0和o_Weight0属性传递给片段着色器,片段着色器生成如下正确输出:
B.(错误)
//Vertex Shader GLSL #version 140 in vec3 a_Position; in uvec4 a_Joint0; in vec4 a_Weight0; flat out vec4 o_Weight0; layout (std140) uniform WorldParams { mat4 ModelMatrix; }; void main() { o_Weight0=a_Weight0; vec4 pos = ModelMatrix * vec4(a_Position, 1.0); gl_Position = pos; }
//Fragment Shader GLSL #version 140 flat in vec4 o_Weight0; out vec4 f_FinalColor; void main() { f_FinalColor=vec4(0,0,0,1); f_FinalColor.rgb += (o_Weight0.xyz + 1.0) / 4.0+(o_Weight0.z + 1.0) / 4.0; }
顶点着色器将o_Weight0属性传递给片段着色器,可见两个着色器中仅省略了o_Joint0相关定义,此时片段着色器生成如下错误输出:
内容的提问来源于stack exchange,提问作者Pablo Yaggi
相关产品推荐
相关产品推荐

