管理OpenGL状态机的策略

我目前正在掌握OpenGL。 我从GLUT开始,但决定“毕业”到SFML库。 SFML实际上比GLUT提供更少的GL实用程序,但是可移植并提供了一些其他功能。 所以这只是我,GL和GLU。 是的,我是一个惩罚的骗子。

我想询问人们用于管理事物的策略,如矩阵变化,颜色变化,材料变化等。

目前,我正在使用“裸体对象”设计理念从单线程进行渲染。 即。 每个图形对象都有一个Render()函数来完成绘图工作。 这些对象本身可能是其他对象的集合,也可能是图形基元的集合。 当一个特定的Render()被调用时,它没有关于在它之前调用了什么变换/材质变化的信息(当然是好事)。

随着事情的发展,我已经解决了某些策略,比如让每个函数承诺推动然后弹出矩阵,如果他们执行任何转换。 使用其他设置,我在调用glBegin()之前明确设置了需要设置的所有内容,并且没有任何glBegin() 。 当一个渲染函数对不太常见的状态变量进行一些更改时,问题就会出现,并且我开始考虑使用一些RAII来强制执行对作用域中所做的所有状态更改的逆转。 使用OpenGL有时会提醒我很多汇编编程。

为了保持这一切都是可管理的,并且帮助调试,我发现我正在开发自己的openGL封装器,所以我认为听到其他人使用的策略,或者关于这个主题的想法和考虑是很好的。 或者,也许是时候切换到像场景图库这样的东西了?

更新:13/5/11

现在已经研究了使用顶点/正常/颜色数组和VBO进行渲染,我决定将所有实际的OpenGL通信合并到一个单独的模块中。 渲染过程将包括从我的对象中获取大量GL独立空间/材质数据,然后以可解释的格式将所有这些信息传递给openGL。 这意味着所有原始数组处理和状态操作将被合并到一个区域中。 它为渲染过程增加了一个额外的间接方法和一点计算开销,但这意味着我可以对所有数据使用一个VBO /数组,然后将它们一次全部传递给OpenGL。


所以这只是我,GL和GLU

我看到没有什么不好。 如果可能的话,我甚至会摆脱GLU。

使用其他设置,我在调用glBegin()之前明确设置了需要设置的所有内容,并且没有任何理由。

这也是一个很好的策略,但是当然你应该把昂贵的状态转换到最低限度。 而不是即时模式(glBegin / glEnd),您应该迁移到使用顶点数组以及可用的顶点缓冲区对象。

当一个渲染函数对不太常见的状态变量进行一些更改时,问题就会出现,并且我开始考虑使用一些RAII来强制执行对作用域中所做的所有状态更改的逆转。

老版本的OpenGL为您提供了属性堆栈,它为客户端状态提供了访问函数glPushAttrib / glPopAttrib和glPushClientAttrib / glPopClientAttrib。

但是,是的,旧的OpenGL版本的巨大状态空间是减少OpenGL-3的主要原因之一; 现在许多固定功能流水线状态所涵盖的内容都是通过着色器配置和访问的,其中每个着色器封装了几十个OpenGL状态变量值。

使用OpenGL有时会提醒我很多汇编编程。

这并不令人意外,因为OpenGL的第一个版本是在假设一些抽象机器(实现)的基础上设计的,OpenGL调用的机器是该机器的操作代码。


首先,尽量不要使用glBegin / glEnd调用进行新的开发。 它们在OpenGL 3中被弃用,并且在OpenGL ES(iOS,WebOS,Android)中不起作用。 相反,使用顶点数组和VBO来整合您的绘图。

其次,不要编写自己的包装,而要看看最近的一些开源代码,看看它们是如何做的。 例如,查看可视化库(http://www.visualizationlibrary.com/jetcms/)。 这是围绕OpenGL的一个相当薄的包装,所以值得一看。

链接地址: http://www.djcxy.com/p/38435.html

上一篇: Strategies for managing the OpenGL state machine

下一篇: Starting with OpenGL and C++, proper path?