C glGetUniform为活动统一返回-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

我有一个调用glGetUniform location的代码,但是它返回-1,即使我在顶点着色器中使用了统一。我没有从
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;
}