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

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
无操作

总结:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思依_xuni

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值