5

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

ISceneNode
    IMeshSceneNode
         StaticMeshSceneNode
    ICameraSceneNode
         StaticCameraSceneNode
         TrackBallCameraSceneNode
    ILightSceneNode
         PointLightSceneNode

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

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

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

在此处输入图像描述

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

这是另一个概念:

在此处输入图像描述

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

你觉得我的想法怎么样?

4

1 回答 1

1

Anton 所说的另一种说法是:如果您想优化状态更改,您不希望场景图中的节点直接进行任何绘制调用。将其委托给您的渲染器,然后渲染器将能够构建一个中间表示,在此基础上它可以重新排序 OpenGL 调用以进行优化。

为您的渲染器定义一个干净的 API 还可以让您分离您的关注点:

  • 画什么,对比
  • 怎么画。

然后你甚至可以使用双重分派(如进化的访问者模式)来使事情更通用。

于 2015-01-15T08:40:28.373 回答