我正在使用OpenGL编写一个简单的3D引擎。我已经实现了一个简单的场景图,其格式如下:
ISceneNode
IMeshSceneNode
StaticMeshSceneNode
ICameraSceneNode
StaticCameraSceneNode
TrackBallCameraSceneNode
ILightSceneNode
PointLightSceneNode
但我想知道一个' Renderer' (实现着色器程序的类)也可以是场景节点(将渲染代码从MeshSceneNode提取到RenderSceneNode)。对我来说,它可能是一个正确的选择,因为如果我必须使用相同的顶点和片段着色器渲染多个网格物体(例如42个网格物体),那么绑定和取消绑定着色器程序只需一次而不是42次就足够了!
那么您如何看待以下架构:
第一个代表我当前的构思(为了简单起见,我不代表' Light'以及' Camera'场景节点。)
所以,在这里,如果我想渲染我的3个网格物体(使用3个着色器程序使用相同的着色器),我将为每个帧绑定和取消绑定3次我的着色器程序(在'渲染'方法中每个Mesh节点)。
这是另一个概念:
正如您在上面所看到的,这次我将在渲染节点中为所有子节点绑定一个唯一的着色器程序。所以它可能会更快。
您如何看待我的想法?
答案 0 :(得分:1)
说出安东所说的另一种方式:如果你想优化状态变化,你不希望场景图中的节点直接进行任何绘制调用。将其委托给渲染器,然后渲染器将构建一个中间表示,根据该表示可以重新排序OpenGL调用以进行优化。
为渲染器定义一个干净的API也可以让您分离您的疑虑:
然后,您甚至可以使用双重调度(如演变的访客模式)来使事情变得更通用。