您的位置:首页 > 其它

ogre 引擎 框架追踪 第七章 渲染流程之compositor

2016-12-09 16:12 344 查看
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

无操作

总结:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ogre 框架