2011-05-12 77 views
14

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

我想请教一下,人有管理的东西,如矩阵的变化,颜色变化,材质的变化等

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

随着事态已经发展我有一定的策略,如使每一个功能的承诺,推动再弹出的矩阵,如果他们进行任何转换解决。对于其他设置,我在调用glBegin()之前明确地设置了需要设置的任何内容,并且没有理所当然。当一个渲染函数对不太常见的状态变量进行一些更改时,问题就会出现,并且我开始考虑使用一些RAII来强制执行对作用域中所做的所有状态更改的逆转。使用OpenGL有时会提醒我很多汇编编程。我发现我实际上正在开发自己的openGL封装器,所以我认为很有必要了解其他人使用的策略,或者关于这些策略的想法和注意事项。学科。或者,也许是时候切换到像场景图库这样的东西了?

更新:13/5/11

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

+0

这是一个很好的问题,你也可能对http://gamedev.stackexchange.com/感兴趣。至于你的问题,它超越了我,但是让我想回到游戏编码。祝你好运 – 2011-05-12 04:11:08

回答

7

所以,它真的只是我,GL和GLU

我什么也看不到的那么糟糕。如果可能的话,我甚至会摆脱GLU。

对于其它设置,我明确地设置 任何需要 之前调用在glBegin设置()和掉以轻心 。

此外,这是一个很好的策略,但当然,你应该保持昂贵的状态转换到最低限度。而不是直接模式(在glBegin/glEnd),则应该迁移到使用顶点数组,如果可用的顶点缓冲对象。

问题蠕变,当一个渲染 功能做了一些变更,以较少 常见的状态变量,我 开始考虑使用一些RAII 执行的一个范围内的所有状态 变化的逆转。

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

使用OpenGL有时会使我想起很多程序集编程的 。

这并不令人意外,因为OpenGL的第一个化身是设计一些抽象机器(实现),在这个机器上OpenGL调用的是那种机器的操作代码。

+0

感谢您对“glPushAttrib()”和“PopAttrib()”的建议。我认为一些RAII与这些命令结合起来应该使状态管理更容易一些。那么困难将不会过头。顶点数组和VBO几乎是我的目标列表中的下一个。我可以问为什么你提到_“我甚至会摆脱GLU”_? – EdF 2011-05-12 16:00:14

+0

@EdF:简单的事实是,GLU已经过时,不再积极维护。另外据我所知,GLU的实现都使用了即时模式,这意味着它不适用于OpenGL-3/4核心配置文件。 – datenwolf 2011-05-12 16:19:54

+0

@EdF:如果你打算通过RAII系统来做到这一点,我没有理由通过gl {Push,Pop} [Client] Attrib来实现这一点。我会通过一个模板机制来实现它,所涉及的状态是模板参数;在构造函数中查询有问题的状态,在析构函数中设置它;还允许状态链接,以便调用一个单一的“redoset”迭代器再次设置所有状态。 – datenwolf 2011-05-12 16:33:47

2

首先,尽量不要使用glBegin/glEnd调用新的开发。它们在OpenGL 3中被弃用,并且在OpenGL ES(iOS,WebOS,Android)中不起作用。相反,使用顶点数组和VBO来整合您的绘图。其次,不要编写自己的包装,而要看看最近的一些开源代码,看看它们是如何做的。例如,查看可视化库(http://www.visualizationlibrary.com/jetcms/)。这是围绕OpenGL的一个相当薄的包装,所以值得一看。