终于到达绘制了,先看总体流程阶段
然而,从并行堆栈上看,已经有渲染线程开启了
跟着电子书走,先是介绍,抄一抄,加深印象。
osg的场景渲染过程可以简单地分为三个阶段:用户APP阶段,更新用户数据、负责场景对象的运动和管理等;筛选cull阶段,负责对场景中的对象进行筛选裁剪,略过那些不会被用户所见(因而不必渲染)的物体,并根据渲染状态的相似性对即将进入渲染管线的对象排序(从而避免OpenGL状态量的频繁切换);绘制(DRAW)阶段,执行各种OpenGL操作,将数据送入OpenGL渲染管线及显示系统处理。
如果有多个图形设备(渲染窗口)时,需要分别为每个窗口的每个摄像机执行相应的筛选和绘制工作,因为各个摄像机的投影矩阵和观察矩阵均可能不同;不过用户APP阶段不需要被执行多次,因为用户数据应当是被各个图形设备所共享的。
对于单线程运行的系统来说,用户/筛选/绘制这三个阶段在每一帧中都应当是顺序执行的;而对于多线程运行,以至多CPU的系统来说,则可以将前后两帧的工作稍微有所交叠。用户更新和场景筛选,以及场景筛选和绘制的工作互相不能重叠;但是我们可以允许在上一帧的绘制没有结束之前,就开始下一帧的用户数据更新工作;我们还可以允许由不同的cpu执行不同图形设备的筛选和绘制工作,从而提高整体渲染的效率,实现实时渲染的目的。
接下来要针对OSG的四种线程模型,讲解osg的渲染机制。
启动渲染线程
几个多线程渲染的变量
而现在,开始单线程
开始跟踪
筛选和绘制是重点,由于电子书后面有,所以不展开。
在renderingTraversals()中,多线程渲染也是同函数,只是设置相应的_startRenderingBarrier,_endRenderingDispatchBarrier,_endDynamicDrawBlock阻塞
先到这里吧