【发布时间】:2016-06-15 17:10:39
【问题描述】:
出于兼容性原因,我必须混合使用旧的和现代的 OpenGL 代码。我想从 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 Integrated Graphics 开发 Xubuntu。
有人可以解释这种行为吗?有人可以提供解决方案吗?
【问题讨论】:
-
Mesa actually giving you 是在您要求 3.3 时未指定
glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE)的兼容性上下文吗?还是默默地升级到Core?glGetError()在glGetFloatv()调用之前/之后返回什么? -
为什么 StackOverflow 上的每个 OpenGL 问题都被否决了..?这是一个完全合理的问题。
-
我在创建上下文后检查了版本(感谢链接)。
glGetString(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当然是第一个被报告为已弃用的函数。 -
当我请求 compatibility 上下文时,我在调用
glutCreateWindow时收到以下错误:X Error of failed request: GLXBadFBConfig Major opcode of failed request: 154 (GLX) Minor失败请求的操作码:34 () 失败请求的序列号:36 输出流中的当前序列号:35