我有这个代码调用glGetUniform位置,但它返回-1,即使我在顶点着色器中使用了制服。我没有从glGetError
或glGetProgramInfoLog
或glGetShaderInfoLog
收到任何错误,并且所有着色器/程序都已成功创建。我也只是在编译和链接后调用它。
int projectionUniform = glGetUniformLocation( shaderProgram, "dfProjection" );
#version 410
uniform float dfRealTime;
uniform float dfGameTime;
uniform mat4 dfProjection;
uniform mat4 dfModelView;
layout(location = 0) in vec3 vertPosition;
layout(location = 1) in vec4 vertColor;
smooth out vec4 color;
out vec4 position;
void main() {
color = vertColor;
position = (dfModelView * dfProjection) * vec4(vertPosition, 1.0);
}
这是片段着色器:
smooth in vec4 color;
out vec4 fragColor;
void main() {
fragColor = color;
}
答案 0 :(得分:1)
有三个positibilites:
dfProjection
中拼写错误glGetUniformLocation
,但似乎并非如此。glGetUniformLocation
调用glUseProgram
之前,您没有绑定正确的程序。position
,这意味着dfProjection
并非真正有效。代码中的另一件事似乎是你将着色器句柄传递给glGetUniformLocation
,你应该传递链接的程序句柄。
编辑后,您没有在片段着色器中使用位置
smooth in vec4 color;
out vec4 fragColor;
in vec4 position;
void main() {
// do sth with position here
fragColor = color*position;
}
请记住,您仍然需要使用gl_Position
按顺序让片段着色器知道最终的片段位置。但我在回答为什么没有检测到统一变量的问题。