一丶 准备渲染列表
Root::OnFrameMove() 里面去调用_updateAllRenderTargets()
每一个 active renderTarget 会调用 itarg->second->update(swapBuffers);
不同的update()会调用到 updateImpl()
updateImpl() 里面会调用 ViewPort的update() 里面会mCamera->_renderScene(this, mShowOverlays);
ViewPort会_renderScene() 里面其实是SceneManager->_renderScene()
_renderScene() 会调用prepareRenderQueue() 去SceneManager准备取数据
接下来回到_renderScene(), 在_findVisibleObjects() 里面会根据 1. SceneManager的类型 2. 相机来查找可视物体
比如我选择的是OtcTreeManager 那么OctreeSceneManager::_findVisibleObjects 会被调用
然后是根据 每个overlay 来做渲染列表
_queueOverlaysForRendering
和天空盒的渲染列表
_queueSkiesForRendering
之后便是我们熟悉的
beingScene和 endScene 了 中间 _renderVisibleObjects便是渲染列表里面所有可见物体
二丶渲染
_renderVisibleObjects 里面会根据渲染列表的排序
enum RenderQueueGroupID
{
/// Use this queue for objects which must be rendered first e.g. backgrounds
RENDER_QUEUE_BACKGROUND = 0,
/// First queue (after backgrounds), used for skyboxes if rendered first
RENDER_QUEUE_SKIES_EARLY = 5,
RENDER_QUEUE_SKIES_LATE = 95,
RENDER_QUEUE_OVERLAY = 100,
};
调用每个RenderQueue的_renderQueueGroupObjects()
比如 SceneManager::renderBasicQueueGroupObjects 这个是最基础的渲染(没有阴影也没有pass)
里面会对每个RenderPriorityGroup进行下列操作
1。 Sort
2。 渲染每个RenderPriorityGroup的每个QueuedRenderableCollections
然后走啊走啊走啊走.. 终于走到了renderSingleObject() 在这里面进行灯光 材质 pass等等的设置 (未完成)
终于开始render 了mDestRenderSystem->_render(ro);
到这里Ogre的渲染流程基本上就走完了