ogre 引擎 框架追踪 第六章 渲染流程
上一章跟踪了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
无操作
总结: