【发布时间】:2009-08-06 20:35:12
【问题描述】:
由于 OpenGL 是一个状态机,我经常在我的程序中使用 glEnable() 和 glDisable() 的东西。我只在开始时进行了少数调用(例如 glClearColor),但大多数其他调用我都会打开和关闭(例如照明,取决于我是在渲染模型还是 3d 文本或 gui)。
您如何跟踪事物的状态?您是否经常在每个功能的顶部设置/重置这些东西?这不是很多不必要的开销吗?
例如,当我编写一个新函数时,有时我知道调用该函数时事物将处于什么状态,而我在函数顶部省略了 glEnable 或 glDisable 或其他相关的状态切换调用。其他时候,我只是提前编写函数并添加这些东西。所以我的函数最终变得非常混乱,其中一些修改了 OpenGL 状态,而另一些只是做出假设(后来被打破了,然后我必须回去弄清楚为什么有些东西变黄了,或者为什么另一个东西是颠倒的,等等。 )。
如何在面向对象的环境中跨函数跟踪 OpenGL?
与这个问题也相关的是,如何知道何时使用 push 和 pop,以及何时只设置值。
例如,假设您有一个程序先绘制一些 3D 内容,然后再绘制一些 2D 内容。显然,投影矩阵在每种情况下都是不同的。你也是:
- 设置 3d 投影矩阵,绘制 3D,设置 2d 投影矩阵,绘制 2d,循环
- 在程序中设置3d投影矩阵;然后绘制 3d,推送矩阵,绘制 2d,弹出矩阵,循环
为什么?
【问题讨论】: