我有一个调用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;
}
最佳答案
有三种正电子石:
您在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
才能使片段着色器知道最终片段位置但我在回答为什么没有检测到统一变量的问题。关于c - glGetUniform为事件制服返回-1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21982031/