You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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属性传递给片段着色器,片段着色器生成如下正确输出:
correct_output

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相关定义,此时片段着色器生成如下错误输出:
incorrect_output

内容的提问来源于stack exchange,提问作者Pablo Yaggi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 16:21:02