先抛出问题
- opengl的机制是状态机,osg是对opengl的面相对象的封装,所以场景树的渲染最终还是要用状态机来实现。osg的场景管理是用场景树来实现的,怎么转换到状态机呢?
- 对于透明物体、hud或者天空渲染等,需要对场景对象进行排序,这个如何实现?
- 默认的状态存在冗余,如何对opengl的状态进行优化?
osg渲染内核是如何解决这些问题的?
- 用状态树对状态进行管理
- 用渲染树对几何体进行管理
参考的是王锐大神的《openscenegraphic三维渲染引擎设计与实践》
流程图
前端
- Group 节点树:
- Drawable 可绘制体:绘制几何体的具体实现者,具体的实现在Geometry中
- Camera 相机
后台
状态树
- 在裁剪阶段,生成状态树和渲染叶
- StateGraph 状态节点
- RenderLeaf 渲染叶:RenderLeaf的Drew()负责渲染
- 这个时候就可以渲染场景了
- 在裁剪阶段,生成状态树和渲染叶
渲染树
- 在裁剪阶段,生成渲染树
- RenderStag 渲染台:渲染树的组节点,是RenderLeaf的父节点
- RenderBin 渲染元:根节点
- 状态机
- State 状态机:封装了openGL的所有状态函数,是状态机的具体实现者
接口
- Render 渲染器:调用SceneView,在ViewBase中被调用
- SceneView 场景视图:结合前端和后台,实现裁剪和绘制功能