关于场景图构思的简单好奇心

时间:2014-04-26 17:05:06

标签: opengl openscenegraph scenegraph

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

ISceneNode
    IMeshSceneNode
         StaticMeshSceneNode
    ICameraSceneNode
         StaticCameraSceneNode
         TrackBallCameraSceneNode
    ILightSceneNode
         PointLightSceneNode

但我想知道一个' Renderer' (实现着色器程序的类)也可以是场景节点(将渲染代码从MeshSceneNode提取到RenderSceneNode)。对我来说,它可能是一个正确的选择,因为如果我必须使用相同的顶点和片段着色器渲染多个网格物体(例如42个网格物体),那么绑定和取消绑定着色器程序只需一次而不是42次就足够了!

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

第一个代表我当前的构思(为了简单起见,我不代表' Light'以及' Camera'场景节点。)

enter image description here

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

这是另一个概念:

enter image description here

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

您如何看待我的想法?

1 个答案:

答案 0 :(得分:1)

说出安东所说的另一种方式:如果你想优化状态变化,你不希望场景图中的节点直接进行任何绘制调用。将其委托给渲染器,然后渲染器将构建一个中间表示,根据该表示可以重新排序OpenGL调用以进行优化。

为渲染器定义一个干净的API也可以让您分离您的疑虑:

  • 画什么,vs。
  • 如何画画。

然后,您甚至可以使用双重调度(如演变的访客模式)来使事情变得更通用。