ogre 引擎 框架追踪 第七章 渲染流程之compositor
2016-12-09 16:12
344 查看
ogre 引擎 框架追踪 第六章 渲染流程
上一章跟踪了ogre在渲染一帧时主要做的事情,并没有对某个特殊处理进行跟踪。比如顶点动画的播放控制、比如gpu程序vertext program与fragment program怎么在渲染过程中起作用的,比如compositor是渲染过程中怎么处理的。compositor脚本内容如下
本章跟踪下compositor的处理。
compositorManager是在root创建时创建的,compositor的资源是在脚本编辑器初始化的时候解析出并创建的。在这里就是把资源通过名字拿出来,并添加CompositorChain。
跟一下addCompositor函数:
主要的是获取CompositorChain这个对象并给他添加compositor资源。CompositorChain继承自 RenderTargetListener, Viewport::Listener, CompositorInstAlloc三个类。继承自RenderTargetListener方便的就是在rendertaget渲染时更新compositor。
CompositorChain在新建时操作:
addCompositor:
compositor激活
后面调用的CompositorChain::setCompositorEnabled->CompositorInstance::setEnabled->CompositorInstance::setAlive->CompositorInstance::createResources 最终创建compositor中所用的technique以及动态纹理
1、preRenderTargetUpdate《顺序1》
调用过程:
Root::renderOneFrame->Root::_updateAllRenderTargets->RenderSystem::_updateAllRenderTargets->RenderTarget::update->RenderTarget::_beginUpdate()->RenderTarget::firePreUpdate->CompositorChain::preRenderTargetUpdate
(1)设置场景管理器被激活的CompositorChain为当前
(2)调用preTargetOperation,操作编译了的状态(TargetOperation的列表)
(3)调用rendertarget的update,更新一次渲染物(compositor的原始输入target)
(4)调用postTargetOperation
2、postRenderTargetUpdate《顺序4》
调用过程:
Root::renderOneFrame->Root::_updateAllRenderTargets->RenderTarget::update->RenderTarget::updateImpl->RenderTarget::_endUpdate()->RenderTarget::firePostUpdate->CompositorChain::postRenderTargetUpdate
渲染物更新后操作
(1)设置场景管理器被激活的CompositorChain为空
3、preViewportUpdate《顺序2》
调用过程:
Root::renderOneFrame->Root::_updateAllRenderTargets->RenderSystem::_updateAllRenderTargets->RenderTarget::update->RenderTarget::updateImpl->RenderTarget::_updateAutoUpdatedViewports->RenderTarget::_updateViewport->RenderTarget::fireViewportPreUpdate->CompositorChain::preViewportUpdate
视口更新前的操作
(1)为原始场景设置参数(取自视口)
(2)调用preTargetOperation。做渲染前准备操作。包括向渲染队列添加监听器,设置场景管理器的显隐掩码,设置是否要查找可见物体
4、postViewportUpdate《顺序3》
调用过程:
Root::renderOneFrame->Root::_updateAllRenderTargets->RenderSystem::_updateAllRenderTargets->RenderTarget::update->RenderTarget::updateImpl->RenderTarget::_updateAutoUpdatedViewports->RenderTarget::_updateViewport->RenderTarget::fireViewportPostUpdate->CompositorChain::postViewportUpdate
视口更新完的操作:
(1)调用postTargetOperation。将场景管理器中在preTargetOperation中渲染队列添加的监听者移除。设置场景管理器为原始的默认参数。
CompositorChain继承自 Viewport::Listener,并重写了
1、viewportCameraChanged
2、viewportDimensionsChanged
3、viewportDestroyed
RQListener mOurListener对象。类继承自RenderQueueListener,并重写了:
1、renderQueueStarted
调用过程:SceneManager::_renderScene->SceneManager::_renderVisibleObjects->SceneManager::renderVisibleObjectsDefaultSequence->SceneManager::fireRenderQueueStarted->CompositorChain::RQListener::renderQueueStarted
渲染队列开始操作进行了
(1)compositorinstance的执行execute
(2)调用SceneManager::_injectRenderWithPass
(3)调用renderSingleObject
(4)调用updateGpuProgramParameters更新compositor中用到的gpu程序参数,并绑定。
2、renderQueueEnded
无操作
总结:
上一章跟踪了ogre在渲染一帧时主要做的事情,并没有对某个特殊处理进行跟踪。比如顶点动画的播放控制、比如gpu程序vertext program与fragment program怎么在渲染过程中起作用的,比如compositor是渲染过程中怎么处理的。compositor脚本内容如下
compositor BC_B&W { technique { // Temporary textures texture rt0 target_width target_height PF_A8R8G8B8 target rt0 { // Render output from previous compositor (or original scene) input previous } target_output { // Start with clear output input none // Draw a fullscreen quad with the black and white image pass render_quad { // Renders a fullscreen quad with a material material MY/BC/Compositor/BlackAndWhite input 0 rt0 } } } }
本章跟踪下compositor的处理。
compositor的创建、注册、激活
compositor的创建、注册Ogre::CompositorManager::getSingleton().addCompositor(vp, compositorName, addPosition);//Viewport *vp, const String &compositor, int addPosition
compositorManager是在root创建时创建的,compositor的资源是在脚本编辑器初始化的时候解析出并创建的。在这里就是把资源通过名字拿出来,并添加CompositorChain。
跟一下addCompositor函数:
CompositorInstance *CompositorManager::addCompositor(Viewport *vp, const String &compositor, int addPosition) { CompositorPtr comp = getByName(compositor);//通过名字获取资源指针 if(comp.isNull()) return 0; CompositorChain *chain = getCompositorChain(vp);//获取或创建CompositorChain return chain->addCompositor(comp, addPosition==-1 ? CompositorChain::LAST : (size_t)addPosition);//添加 }
主要的是获取CompositorChain这个对象并给他添加compositor资源。CompositorChain继承自 RenderTargetListener, Viewport::Listener, CompositorInstAlloc三个类。继承自RenderTargetListener方便的就是在rendertaget渲染时更新compositor。
CompositorChain在新建时操作:
mOldClearEveryFrameBuffers = vp->getClearBuffers(); vp->addListener(this);//视口事件监听 createOriginalScene();//创建原始场景(为当前viewport) vp->getTarget()->addListener(this);//rendertarget事件监听
addCompositor:
CompositorInstance* CompositorChain::addCompositor(CompositorPtr filter, size_t addPosition, const String& scheme) { filter->touch();//加载compositor资源 CompositionTechnique *tech = filter->getSupportedTechnique(scheme); if(!tech) { /// Warn user LogManager::getSingleton().logMessage( "CompositorChain: Compositor " + filter->getName() + " has no supported techniques.", LML_CRITICAL ); return 0; } CompositorInstance *t = OGRE_NEW CompositorInstance(tech, this);//创建compositor对象 if(addPosition == LAST) addPosition = mInstances.size(); else assert(addPosition <= mInstances.size() && "Index out of bounds."); mInstances.insert(mInstances.begin()+addPosition, t); mDirty = true; mAnyCompositorsEnabled = true; return t; }
compositor激活
Ogre::CompositorManager::getSingleton().setCompositorEnabled(vp, compositorName, true);//Viewport *vp, const String &compositor, bool value
后面调用的CompositorChain::setCompositorEnabled->CompositorInstance::setEnabled->CompositorInstance::setAlive->CompositorInstance::createResources 最终创建compositor中所用的technique以及动态纹理
渲染过程中的compositor
CompositorChain继承自RenderTargetListener,并重写了1、preRenderTargetUpdate《顺序1》
调用过程:
Root::renderOneFrame->Root::_updateAllRenderTargets->RenderSystem::_updateAllRenderTargets->RenderTarget::update->RenderTarget::_beginUpdate()->RenderTarget::firePreUpdate->CompositorChain::preRenderTargetUpdate
(1)设置场景管理器被激活的CompositorChain为当前
(2)调用preTargetOperation,操作编译了的状态(TargetOperation的列表)
(3)调用rendertarget的update,更新一次渲染物(compositor的原始输入target)
(4)调用postTargetOperation
2、postRenderTargetUpdate《顺序4》
调用过程:
Root::renderOneFrame->Root::_updateAllRenderTargets->RenderTarget::update->RenderTarget::updateImpl->RenderTarget::_endUpdate()->RenderTarget::firePostUpdate->CompositorChain::postRenderTargetUpdate
渲染物更新后操作
(1)设置场景管理器被激活的CompositorChain为空
3、preViewportUpdate《顺序2》
调用过程:
Root::renderOneFrame->Root::_updateAllRenderTargets->RenderSystem::_updateAllRenderTargets->RenderTarget::update->RenderTarget::updateImpl->RenderTarget::_updateAutoUpdatedViewports->RenderTarget::_updateViewport->RenderTarget::fireViewportPreUpdate->CompositorChain::preViewportUpdate
视口更新前的操作
(1)为原始场景设置参数(取自视口)
(2)调用preTargetOperation。做渲染前准备操作。包括向渲染队列添加监听器,设置场景管理器的显隐掩码,设置是否要查找可见物体
4、postViewportUpdate《顺序3》
调用过程:
Root::renderOneFrame->Root::_updateAllRenderTargets->RenderSystem::_updateAllRenderTargets->RenderTarget::update->RenderTarget::updateImpl->RenderTarget::_updateAutoUpdatedViewports->RenderTarget::_updateViewport->RenderTarget::fireViewportPostUpdate->CompositorChain::postViewportUpdate
视口更新完的操作:
(1)调用postTargetOperation。将场景管理器中在preTargetOperation中渲染队列添加的监听者移除。设置场景管理器为原始的默认参数。
CompositorChain继承自 Viewport::Listener,并重写了
1、viewportCameraChanged
2、viewportDimensionsChanged
3、viewportDestroyed
RQListener mOurListener对象。类继承自RenderQueueListener,并重写了:
1、renderQueueStarted
调用过程:SceneManager::_renderScene->SceneManager::_renderVisibleObjects->SceneManager::renderVisibleObjectsDefaultSequence->SceneManager::fireRenderQueueStarted->CompositorChain::RQListener::renderQueueStarted
渲染队列开始操作进行了
(1)compositorinstance的执行execute
(2)调用SceneManager::_injectRenderWithPass
(3)调用renderSingleObject
(4)调用updateGpuProgramParameters更新compositor中用到的gpu程序参数,并绑定。
2、renderQueueEnded
无操作
总结:
相关文章推荐
- ogre 引擎 框架追踪 第六章 渲染流程
- ogre 引擎 框架追踪 第五章 资源加载之实加载
- ogre 引擎 框架追踪 第一章 root的创建
- ogre 引擎 框架追踪 第三章 资源加载之虚加载
- ogre 引擎 框架追踪 第二章 初始化
- ogre 引擎 框架追踪 第四章 资源加载之资源组初始化
- Ogre学习笔记(3):Mesh的渲染流程
- ogre渲染流程
- Ogre内部渲染流程分析系列
- Ogre的渲染流程,在渲染时材质是如何起作用的,材质加载和解析
- Ogre中Mesh的加载与渲染流程
- /LGC图形渲染/3D 图形渲染引擎 OGRE 体系结构
- ogre的主要渲染流程
- ogre的主要渲染流程
- 每天花30分钟看OGRE--(13)Ogre的渲染流程,在渲染时材质是如何起作用的,材质加载和解析
- ogre Mesh的渲染流程
- 基于OGRE所实现的高层游戏引擎框架(2)
- 高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
- OGRE主要渲染流程简介(转)
- OGRE - RenderProcess (渲染流程)