我正在使用OpenGL编写一个简单的3D引擎。我已经用以下模式实现了一个简单的场景图:

ISceneNode
    IMeshSceneNode
         StaticMeshSceneNode
    ICameraSceneNode
         StaticCameraSceneNode
         TrackBallCameraSceneNode
    ILightSceneNode
         PointLightSceneNode

但是我想知道“Renderer”(实现着色器程序的类)是否也可能是场景节点(将渲染代码从MeshSceneNode提取到RenderSceneNode)。对我来说,这可能是一个正确的选择,因为如果我必须使用相同的顶点和片段着色器渲染多个网格(例如42个网格),那么绑定(bind)着色器程序一次和而不是42次绑定(bind)和取消绑定(bind)应该是有用的!

那么您如何看待以下架构:

第一个代表我当前的概念(为简单起见,我不代表“光”和“相机”场景节点)。

因此,在这里,如果要渲染3个网格物体(使用使用相同着色器的3个着色器程序),我将为每个帧绑定(bind)和取消绑定(bind)3次着色器程序(在每个Mesh节点的“渲染”方法中)。

这是另一个概念:

如您在上面看到的,这次我将在渲染节点中为所有子节点绑定(bind)一个唯一的着色器程序。因此它可能会更快。

您如何看待我的想法?

最佳答案

用另一种方式表达安东所说的话:如果要优化状态更改,则不希望场景图中的节点直接进行任何绘制调用。将其委托(delegate)给渲染器,渲染器随后将能够构建中间表示形式,并基于该中间表示形式可以对OpenGL调用进行重新排序以进行优化。

为渲染器定义一个干净的API还将使您能够分开您的关注点:

  • 相比画什么
  • 如何绘制它。

  • 然后,您甚至可以使用双重分派(dispatch)(例如演化的访客模式)来使事情变得更通用。

    关于opengl - 关于场景图概念的简单好奇心,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23314061/

    10-15 16:24