![353d91ca54be51bbffbf5f7fa391d260.png](https://i-blog.csdnimg.cn/blog_migrate/87286ca8169e9d712b0756d1b05102c4.jpeg)
好。到这里我们就算是完成了对osg::frame的整体介绍(针对单线程的),下面我们就来整体的总结一下fame函数的整个流程。
![2cda4ea7572e9356c9a987f95b4df438.png](https://i-blog.csdnimg.cn/blog_migrate/3038a2c246a745d0fad61c0f3c741ac0.jpeg)
OSG 渲染后台与用户层的接口是摄像机类(Camera)。场景中至少有一个主摄像机,它关联了一个图形设备(GraphicsContext,通常是窗口),以及一个渲染器(Renderer);我们可以在场景树中(或者别的视图 View 中,对于复合视景器而言)添加更多的摄像机,它们可以关联相同的或者其它的图形设备,但都会配有单独的渲染器,用以保存该摄像机的筛选设置、显示器设置等信息。
场景筛选和绘制的工作由渲染器来完成,而图形设备 GraphicsContext 则负责根据不同时机的选择,调用渲染器的相关函数。例如在单线程模式中,ViewerBase::renderingTraversals函数依次执行 Renderer::cull 和 Renderer::draw 函数(后者通过 GraphicsContext::runOperations调用),而在多线程模型中调用者的关系将更加错综复杂。
OSG 渲染后台的调度中心是场景视图(SceneView),它负责保存和执行筛选访问器(CullVisitor)。CullVisitor 负责遍历并裁减场景,同时在遍历过程中构建对于场景绘制至关重要的渲染树和状态树;生成的状态树以 StateGraph 为根节点和各级子节点(其中保存场景树的渲染状态 StateSet 数据),以 RenderLeaf 为末端叶节点的内容(其中保存场景树中的几何体 Drawable 对象);渲染树则以 RenderStage 为根节点,RenderBin 为各级子节点,根据渲染顺序和方法的设定,状态树中的节点和渲染叶(RenderLeaf)被记录到 RenderStage 和各级 RenderBin 中;SceneView 负责保存和维护状态树和渲染树。
绘制场景时,渲染树中的各级节点将取出保存的渲染叶数据,传递给 OSG 状态机(State)。后者是 OpenGL 状态机制的封装和实现,也是场景绘制的核心元件。状态机取得渲染叶中的几何数据之后,再向根部遍历状态树,取得该几何体绘制相关的所有渲染状态设置,并亲自或者交由 StateAttribute 派生类完成渲染状态的实际设定,以及场景元素的实际绘制工作。此时用到的就已经是我们耳熟能详的各种 OpenGL 函数了。
最后部分我们来探究一下osg的多线程渲染模式。
原文链接 http://www.3wwang.cn/html/article_70.html