glGetUniform为活动制服返回-1

时间:2014-02-24 08:01:23

标签: c opengl glsl

我有这个代码调用glGetUniform位置,但它返回-1,即使我在顶点着色器中使用了制服。我没有从glGetErrorglGetProgramInfoLogglGetShaderInfoLog收到任何错误,并且所有着色器/程序都已成功创建。我也只是在编译和链接后调用它。

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;
}

1 个答案:

答案 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按顺序让片段着色器知道最终的片段位置。但我在回答为什么没有检测到统一变量的问题。