【问题标题】:OpenGL render state managementOpenGL渲染状态管理
【发布时间】:2009-07-15 10:07:35
【问题描述】:

我目前正在开发一款小型 iPhone 游戏,并且正在将我开始为 Mac 开发的 3d 引擎移植到 iPhone 上。这一切进展顺利,Mac 引擎的所有功能现在都出现在 iPhone 上。引擎还没有完成,但现在至少我有了基本的资源管理、一个场景图和一个可以轻松动画和移动对象的构造。

我现在拥有的截图:http://emle.nl/forumpics/site/planes_grid.png。这架小飞机是我几年前为当时正在制作的游戏制作的测试对象。它与我现在正在开发的游戏无关,但 3d 引擎及其设施当然是。

现在,我来到了材质的话题,关于哪些纹理、灯光等属于可渲染对象的描述。这意味着对每个对象都有大量的 OpenGL 客户端状态和 glEnable/glDisable 调用。你建议用什么方法来最小化这些状态变化? 目前我正在按材质排序,因为具有相同材质的对象根本不需要任何更改。我创建了一个名为 RenderState 的类,它缓存当前的 OpenGL 状态,并且仅在选择不同材质时应用不同的成员。这是一个可行的解决方案,还是会在引擎成熟并且需要缓存越来越多的状态时变得无法控制?

【问题讨论】:

    标签: iphone opengl-es


    【解决方案1】:

    一点建议。只需编写游戏所需的代码。不要花时间编写通用渲染引擎,因为您很可能不需要它。如果您结束编写另一个游戏,那么此时将有用的部分提取到引擎中。这样会更快。

    【讨论】:

    • 你说得有道理。但是,至少拥有一个稍微通用和优化的图形引擎将使我快速了解我的一些想法。我认为渲染状态问题仍然有效,因为特定于游戏的引擎也必须进行一些渲染状态管理......
    【解决方案2】:

    如果 OpenGL ES 中的状态数量与标准版本一样多,在某些时候将难以管理。

    此外,如果您真的想尽量减少状态更改,您可能需要某种状态排序概念,以便将具有相似状态的可绘制对象一起渲染,而无需在它们之间使用大量 glEnable/glDisable。但是,即使在 PC 硬件上,这也可能有点难以管理(想象对数千个可绘制对象进行状态排序),并且盲目地更改状态实际上可能更便宜,具体取决于 OpenGL 实现。

    为了进行比较,以下是 OpenSceneGraph 采用的方法:

    基本上,场景图中的每个节点都有自己的状态集,用于存储材质属性、状态等。好消息是状态集可以由多个节点共享。这样,渲染后端就可以根据它们的状态集指针(而不是状态集的内容!)对可绘制对象进行排序,并将具有相同状态集的节点一起渲染。这提供了一个很好的折衷方案,因为后端不需要管理单独的 opengl 状态,但如果相应地生成场景图,则可以实现几乎最小的状态变化。

    我的建议是,在您的情况下,您应该在坚持解决方案之前进行大量测试。无论你做什么,我确信你需要对 OpenGL 状态进行某种抽象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 2013-12-27
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      相关资源
      最近更新 更多