如何跨函数调用跟踪OpenGL状态?

Ric*_*ket 8 opengl oop

由于OpenGL是一个状态机,我在程序中经常使用glEnable()和glDisable().我只在开始时选择了几个调用(例如glClearColor),但是大多数其他调用我打开和关闭(如照明,取决于我是渲染模型还是3d文本或gui).

你如何跟踪状态?你是否经常在每个功能的顶部设置/重置这些东西?这不是很多不必要的开销吗?

例如,当我编写一个新函数时,有时候我知道在调用函数时状态会是什么,并且我在函数顶部省略了glEnable或glDisable或其他相关的状态切换调用.其他时候,我只是提前编写函数,并添加了这些东西.所以我的函数最终变得非常凌乱,其中一些修改了OpenGL状态,而其他一些只是做出假设(后来被破坏了,然后我必须回过头来弄清楚为什么某些东西会变黄或为什么另一个东西是颠倒的等等. ).

如何在面向对象的环境中跨函数跟踪OpenGL?


也与此问题有关,是如何知道何时使用push和pop,以及何时只设置值.

例如,假设您有一个程序可以绘制一些3D内容,然后绘制一些2D内容.显然,投影矩阵在每种情况下都是不同的.你也是:

  1. 设置3d投影矩阵,绘制3D,设置2d投影矩阵,绘制2d,循环
  2. 在程序中设置一个三维投影矩阵; 然后绘制3d,推动矩阵,绘制2d,弹出矩阵,循环

为什么?

bkr*_*zer 2

很好的问题。想想纹理是如何工作的。OpenGL 需要在大量纹理之间进行切换,并且您需要在每次切换后启用/禁用纹理绘制您通常会尝试通过一次绘制具有相同纹理的所有对象来优化这一点,但仍然存在大量的状态切换。因此,我尽力一次绘制具有相同状态的所有内容,但我不确定按照您的想法优化它是否非常重要。

至于3D和2D投影模式之间的推入和弹出,推入和弹出旨在用于分层建模。如果您需要 2D 投影位于相对于 3D 对象的位置,请务必推动矩阵并切换到 2D 投影模式,然后在完成后弹出。但是,如果您正在编写一个在屏幕上具有固定位置的 2D GUI 覆盖层,我认为推入和弹出没有理由很重要。