我有这个代码调用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;
}
有三个正态:
- 您在
glGetUniformLocation
中拼错了dfProjection
,但似乎并非如此。 - 或者您没有在片段着色器中使用
position
,这意味着dfProjection
并不真正活跃。
glUseProgram
调用glGetUniformLocation
之前,您没有绑定正确的程序。代码中的另一件事似乎是您正在传递着色器句柄,glGetUniformLocation
您应该传递链接程序句柄。
编辑后,您没有在片段着色器中使用位置,
smooth in vec4 color;
out vec4 fragColor;
in vec4 position;
void main() {
// do sth with position here
fragColor = color*position;
}
请记住,您仍然需要使用gl_Position
以便片段着色器知道最终的片段位置。但我回答的是为什么没有检测到均匀变量的问题。