【问题标题】:Current OpenGL matrix mode当前的 OpenGL 矩阵模式
【发布时间】:2016-04-04 23:26:25
【问题描述】:

能否确定OpenGL当前使用的矩阵模式?

例如,我目前有以下(由窗口调整大小触发):

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

但是,最好返回之前使用的矩阵模式,而不是假设GL_MODElVIEW。有没有可以预先调用的函数来存储之前的状态?

【问题讨论】:

  • 您为什么希望当前的矩阵模式不是GL_MODELVIEW
  • @Kos 考虑到有四种不同的矩阵模式可用,我假设当调整大小事件发生时它们中的任何一种都可能正在使用中。虽然我没想到,但我认为至少考虑一下这种可能性是件好事。话虽这么说,我是新手,所以情况可能并非如此。
  • 我不买。您是否在代码中有 N 个地方期望“矩阵模式应该是我离开它的样子”和 M 个地方说“我应该让矩阵模式保持原样”?这似乎过于复杂。我宁愿看整个渲染循环,并建立一个约定,在渲染的哪个阶段应该设置什么模式。
  • @Kos 重要的一点是,这发生在回调函数中,而不是直接在渲染循环中。如果它直接在渲染循环中,我肯定会明确地将矩阵模式设置为我想要的任何后续调用。然而,由于这个函数理论上可以从任何地方调用,它应该完全独立于调用状态并且没有任何意外的副作用(为什么屏幕调整大小会强制GL_MODELVIEW模式?)。
  • 你是什么意思,任何地方?您要么有一个显式的主循环,您可以在其中迭代事件并处理它们(WinAPI、SDL、GLFW ...),或者(在 GLUT 的情况下)您将主循环隐藏在框架内。无论哪种方式,resize 事件都不应该是可以从任何地方调用的“中断”,它只是事件循环的正常部分。处理窗口事件和渲染是不同的“阶段”。

标签: opengl projection-matrix


【解决方案1】:

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

但是,还有一种更优雅且最有可能更有效的方法。旧版 OpenGL 有一个属性堆栈,允许您在不使用任何 glGet*() 调用的情况下保存/恢复属性值。在此示例中,您将使用:

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

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

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

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

【讨论】:

  • 谢谢,这个答案更完整,更有启发性。我不知道glGet* 的性能问题,但无论如何堆栈更干净。不幸的是,这个项目需要 LegacyGL。
  • @watarok:嗯,属性堆栈是旧版 OpenGL 的一部分。它已从现代 OpenGL 中移除
  • @RetoKoradi:属性堆栈的一个缺点是它可能会溢出。因此,如果您正在编写一个插件,您可能最终会遇到没有属性堆栈的情况。简单、万无一失的版本是使用 glGet。但是可以在推送属性堆栈时测试堆栈溢出(glGetError),如果前者失败则回退到 glGet。
【解决方案2】:

glGetIntegerv 带有参数 GL_MATRIX_MODE 应该这样做。

【讨论】:

    【解决方案3】:

    所以我得到 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
    

    【讨论】:

      猜你喜欢
      • 2012-05-08
      • 2011-05-20
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多