glGetUniformLocation给出glError:GL_INVALID_VALUE

时间:2014-04-14 17:13:45

标签: c++ qt opengl

我使用this minimal example的某种修改版本来获取与Oculus HMD一起使用的OpenGL代码(在Qt 5.2.0中)。相关部分没有被我改变。

然而,gl_uniform_2f / 4f / 1i函数中对glGetUniformLocation的调用总是给出glError GL_INVALID_VALUE(它肯定是这个调用,我使用了很多glGetError次调用找到它。)

我之前读过,尝试在不同的线程中执行此类操作可能会导致问题,但我不使用线程(据我所知,无论如何)。

着色器程序编译/链接没有任何问题,因此也不应该成为问题。

到目前为止,我没有尝试任何帮助,因为我对着色器缺乏经验,也许有人可以很容易地看到问题。

编辑:使用

验证着色器程序后
glValidateProgram(gl_fragment_shader_program);
glGetProgramiv(gl_fragment_shader_program, GL_VALIDATE_STATUS, &Result);
glGetProgramiv(gl_fragment_shader_program, GL_INFO_LOG_LENGTH, &InfoLogLength);
std::vector<char> ProgramErrorMessage(InfoLogLength+1);
glGetProgramInfoLog(gl_fragment_shader_program, InfoLogLength, NULL, &ProgramErrorMessage[0]);
qDebug() << &ProgramErrorMessage[0];

结果是

Validation warning! - Sampler value texture0 has not been set.
Validation successful.

因为我在其他地方读过这个警告通常可以忽略,我没想到它。

edit2:好的,我现在意识到该程序必须在glDraw()调用之前进行验证。在这种情况下警告消失了,但原始问题的GL_INVALID_VALUE错误仍然存​​在。

1 个答案:

答案 0 :(得分:1)

经过大量挖掘后,我发现我的函数将着色器程序等的GLuint句柄初始化为0,称为QGLWidget::initializeGL()调用后的方式。所以它毕竟不是一个openGL问题,我当前没有正确的着色器程序。

我希望这可以帮助那些可能使用Qt和openGL的人,但到目前为止还没有很多经验(像我一样)。