出于兼容性原因,我必须混合使用旧和现代OpenGL代码。我希望通过使用uniform变量从OpenGL检索当前的投影和模型视图矩阵,并将其传递给着色器。
以下代码显示了我尝试仅获取投影矩阵的方法。它没有按预期工作:
float m[16];
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, aspect, 0.01f, 2.0f);
glGetFloatv(GL_PROJECTION_MATRIX, m);
在这些代码之后,矩阵m
包含单位矩阵。我使用以下代码进行了检查:
printf("%f %f %f %f\n", m[0], m[4], m[8], m[12]);
printf("%f %f %f %f\n", m[1], m[5], m[9], m[13]);
printf("%f %f %f %f\n", m[2], m[6], m[10], m[14]);
printf("%f %f %f %f\n", m[3], m[7], m[11], m[15]);
我使用freeglut创建了上下文,并使用以下代码显式请求了OpenGL 3.3上下文:
...
glutInitContextVersion(3, 3);
glutCreateWindow(title);
当我将版本更改为OpenGL 2.0时,上述代码按预期工作。每个版本以上都会产生所描述的问题。
我正在使用Intel Corporation Broadwell-U集成图形在Xubuntu上工作。
有人可以解释这种行为吗?有人可以提供解决方案吗?
glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE)
,Mesa是否会实际给你提供兼容性上下文?还是会自动升级为核心上下文?在调用glGetFloatv()
之前/之后,glGetError()
返回什么? - genpfaultglGetString(GL_VERSION)
返回*Version: 4.3 (Core Profile) Mesa 12.1.0-devel (git-8c3ecde 2016-06-08 xenial-oibaf-ppa)*,而glGetIntegerv(GL_MAJOR_VERSION/GL_MINOR_VERSION, ...)
也告诉我同样的信息。为什么当我明确请求一个3.3上下文时,会得到不同的版本? 核心上下文解释了这种行为。我使用ARB_debug_output
添加了一个错误回调,而glMatrixMode
是第一个被报告为已弃用的函数。 - HenkkglutCreateWindow
时就会得到以下错误: X Error of failed request: GLXBadFBConfig Major opcode of failed request: 154 (GLX) Minor opcode of failed request: 34 () Serial number of failed request: 36 Current serial number in output stream: 35 - Henkk