我使用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
错误仍然存在。
答案 0 :(得分:1)
经过大量挖掘后,我发现我的函数将着色器程序等的GLuint句柄初始化为0,称为QGLWidget::initializeGL()
调用后的方式。所以它毕竟不是一个openGL问题,我当前没有正确的着色器程序。
我希望这可以帮助那些可能使用Qt和openGL的人,但到目前为止还没有很多经验(像我一样)。