当前的 OpenGL 矩阵模式

Current OpenGL matrix mode

是否可以确定OpenGL当前使用的矩阵模式?

例如,我目前有以下内容(由 window 调整大小触发):

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-width, width, -height, height, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);

不过,return比以前使用的矩阵模式更可取,而不是假设GL_MODElVIEW。有没有可以预先调用的函数来存储之前的状态?

glGetIntegerv 参数 GL_MATRIX_MODE 应该这样做。

使用 glGetIntegerv(GL_MATRIX_MODE, ...) 获取当前值是显而易见的答案。

但是,还有一种更优雅且最有可能更有效的方法。旧版 OpenGL 有一个属性堆栈,允许您 save/restore 属性值而无需使用任何 glGet*() 调用。在此示例中,您将使用:

glPushAttrib(GL_TRANSFORM_BIT);
// Code that modifies transform mode.
glPopAttrib();

您可以查看传递给 glPushAttrib() 的哪个位保存了 man page 上 table 中的什么状态。

您通常应该尽可能避免 glGet*() 调用,因为它们可能会影响性能。在仅在 window 调整大小时执行代码的特定示例中,这显然不是问题。但是在频繁执行的代码中,这变得更加关键。

属性堆栈已弃用,并且在 OpenGL 核心配置文件中不可用。但是由于您使用的是矩阵堆栈(也已弃用),我认为您很乐意table 在代码中使用遗留功能。

所以我得到 5888、5889 个值

glMatrixMode(GL.GL_PROJECTION)
glLoadIdentity()  # Reset all graphic/shape's position
print("GL_MATRIX_MODE:", glGetIntegerv(GL_MATRIX_MODE))
# GL_MATRIX_MODE: 5889


glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
print("GL_MATRIX_MODE:", glGetIntegerv(GL_MATRIX_MODE))
# GL_MATRIX_MODE: 5888