Opengl 为什么两行不相关的代码会更改GLSL着色器颜色?

Opengl 为什么两行不相关的代码会更改GLSL着色器颜色?,opengl,glsl,lwjgl,Opengl,Glsl,Lwjgl,我有一个GLSL顶点着色器,工作正常: void main(void){ gl_Position = ftransform(); gl_FrontColor = gl_Color; pass_textureCoords = textureCoords; } 与片段着色器(与此问题无关)一起,它们输出一个纹理模型,这是我所期望的 但是,当我添加两行不相关的代码时: void main(void){ gl_Position = ftransform(); gl_FrontColor = gl

我有一个GLSL顶点着色器,工作正常:

void main(void){

gl_Position = ftransform();
gl_FrontColor = gl_Color;
pass_textureCoords = textureCoords;
}
与片段着色器(与此问题无关)一起,它们输出一个纹理模型,这是我所期望的

但是,当我添加两行不相关的代码时:

void main(void){

gl_Position = ftransform();
gl_FrontColor = gl_Color;
pass_textureCoords = textureCoords;
surfaceNormal = normal; //Sets an out vec3 called surfaceNormal to normal.
toLightVector = lightPosition - position; //Does the same as the above.
}
一切似乎都变黑了

我找不到任何理由。代码根本不会影响任何着色器输出的颜色。事实上,就其本身而言,这两条线(据我所知)是绝对无用的,什么也不做

虽然与问题不太相关,但以下是片段着色器:

in vec2 pass_textureCoords;
in vec3 surfaceNormal;
in vec3 toLightVector;

out vec4 out_Color;

uniform sampler2D textureSampler;

uniform vec3 lightColour;

void main(void){
vec4 colour = gl_Color;
vec4 textureColor = texture(textureSampler, pass_textureCoords);
if(textureColor.a<0.5){
    discard;
}
out_Color = vec4(textureColor.r, textureColor.g, textureColor.b, 1);

}
vec2 pass\u textureCoords中的
;
vec3表面异常;
在vec3-toLightVector中;
out vec4 out_颜色;
均匀取样器;二维纹理取样器;
均匀的vec3浅色;
真空总管(真空){
vec4颜色=gl_颜色;
vec4 textureColor=纹理(纹理采样器,传递纹理单词);

如果(textureColor.ama可能与您声明了两个未使用且可能已优化的vec3项有关。如果您将pass_textureCoords作为最后一个语句,请查看它是否仍然这样做。当OpenGL GLSL编译器看到未使用的变量时,它会毫不犹豫地删除它。因此,可能顶点着色器会传递所有数据,but您的片段着色器,仅使用
传递\u textureCoords
,删除其他,然后出现移位问题。尝试在片段着色器中“假”使用in变量,如
if(surfaceNormal.x==toLightVector.x)color.r+=0.01;
可能是因为您正在使用(不推荐)修复了照明附带的函数管道功能,我建议您从代码中剔除所有不推荐的内容。@Joehot200创建和管理您自己的矩阵,并将它们作为统一传递,使用VertexAttributeArray和GlDrawArray传递位置,而不是glVertex。着色器可能不会编译,因为这些额外的lines。正如@Bahbar所建议的,如果没有看到完整的着色器代码,就不可能知道。发布时,它使用了未定义的变量。这可能与您声明了两个未使用的vec3项有关,这可能是经过优化的。如果您将pass_textureCoords作为最后一个语句,看看它是否仍然这样做。当enGL GLSL编译器看到未使用的变量时,会毫不犹豫地将其删除。因此,可能顶点着色器会传递所有数据,但片段着色器仅使用
传递\u textureCoords
,就会删除其他变量,然后出现移位问题。尝试在片段着色器中“假”使用in变量,如
如果(surfaceNormal.x==toLightVector.x)color.r+=0.01;
可能是因为您正在使用(已弃用)修复了照明附带的函数管道功能,我建议您从代码中剔除所有不推荐的内容。@Joehot200创建和管理您自己的矩阵,并将它们作为统一传递,使用VertexAttributeArray和GlDrawArray传递位置,而不是glVertex。着色器可能不会编译,因为这些额外的l正如@Bahbar所建议的,如果没有看到完整的着色器代码,就不可能知道。在发布时,它使用了未定义的变量。