C glGetUniform为活动统一返回-1
我有一个调用glGetUniform location的代码,但是它返回-1,即使我在顶点着色器中使用了统一。我没有从C glGetUniform为活动统一返回-1,c,opengl,glsl,C,Opengl,Glsl,我有一个调用glGetUniform location的代码,但是它返回-1,即使我在顶点着色器中使用了统一。我没有从glGetError或glGetProgramInfoLog或glGetShaderInfoLog中获得任何错误,并且着色器/程序都已成功创建。我也只在它被编译和链接后才调用它 int projectionUniform=glGetUniformLocation(着色器程序,“dfProjection”) 这是片段着色器: smooth in vec4 color; out ve
glGetError
或glGetProgramInfoLog
或glGetShaderInfoLog
中获得任何错误,并且着色器/程序都已成功创建。我也只在它被编译和链接后才调用它
int projectionUniform=glGetUniformLocation(着色器程序,“dfProjection”)代码>
这是片段着色器:
smooth in vec4 color;
out vec4 fragColor;
void main() {
fragColor = color;
}
共有三个positibilite:
- 您在
glGetUniformLocation
中拼写错误了dfProjection
,但似乎不是这样
- 在使用
glUseProgram
调用glGetUniformLocation
之前,您没有绑定正确的程序
- 或者您没有在片段着色器中使用
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
,以便片段着色器知道最终片段位置。但是我回答了为什么没有检测到统一变量的问题。我认为可以在顶点着色器中定义out vec4,而不是使用gl_位置?也许这就是我做错的地方。我正在传递程序句柄,我只是叫它shader,这可能是个坏名字。哦,好的。那么,我不知道我做错了什么。@TomTetlaw向我们展示你的片段着色器,顺便问一下,你确定你正在将程序句柄传递给glGetUniformLocation
而不是着色器吗?@TomTetlaw正如我在回答中所说,你没有在片段着色器中使用position
。@TomTetlaw你可以(也应该)这样做对于片段着色器,使用out vec4代替gl_FragColor。对于顶点着色器,如果使用out vec4而不是gl_位置,gl无法知道输出是用于片段着色器还是作为位置。因此,不推荐使用gl_FragColor,而不是gl_Position。
smooth in vec4 color;
out vec4 fragColor;
in vec4 position;
void main() {
// do sth with position here
fragColor = color*position;
}