CEGUI 对RTT纹理的支持------Gamebryo实现渲染到CEGUI窗口

来源:互联网 发布:centos7 关闭3306端口 编辑:程序博客网 时间:2024/06/04 17:46

  最近在纠结新版CEGUI的特性研究和拓展。验证并实现几个CEGUI的特性:

1、CEGUI对Shader的支持拓展。

2、CEGUI用Shader实现灰化,多纹理图片叠层。

3、Gamebryo渲染到CEGUI窗口纹理(装备预览)。

 

以下完整解释下第三点的实现,Gamebryo是在Frame System帧系统实现的:

1、构建一个NiRenderClick其作为渲染主角,其渲染结果作为输出,渲染到CEGUI窗口:

 

2、同样构建一个CEGUIHandleClick作为CEGUI的渲染。

 

 

3、构建一个RunHandleStep,继承于NiDefaultClickRenderStep。

然后把上面两个Click加入此Step:


 m_pkRTTClick = NiNew RTTHandleClick;
 m_pkCEGUIClick = NiNew CEGUIHandleClick;
 AppendRenderClick(m_pkRTTClick);
 AppendRenderClick(m_pkCEGUIClick);

 

同时注册两个方法,一个Step前后回调函数:
 SetPreProcessingCallbackFunc(CopyRTGBufferToTexture,this);
 SetPostProcessingCallbackFunc(SetUITexture,this);

 

4、让RTTHandleClick渲染到纹理:

 

注意 m_spRenderGroup =   NiRenderTargetGroup::Create(

m_spRenderTexture->GetBuffer(), pkD3DRenderer, true, true);

m_spRenderGroup =  m_pRenderManger->CreateRenderTargetGroupFromTexture(m_spRenderTexture);

 

NiRenderTargetGroup的构建有两种方法,我们不能取其默认的第一种,因为Usage为D3DUSAGE_RENDERTARGET的Texture不能进行反锯齿, 而且Pool必须为D3DPOOL_DEFAULT. 如果想利用RenderTarget做为纹理又想反锯齿, 可以先把场景渲染到一个CreateRenderTarget创建的Surface(或BackBuffer)上, 再用IDirect3DDevice9::StretchRect拷贝到纹理上。

 

我详细列出CreateRenderTargetGroupFromTexture的代码细节:

 

 

创建一个RenderTargetSurface,然后把Surface拷到NiDX92DBufferData,然后通过NiDX92DBufferData构建NiRenderTargetGroup。

 

5、在RenderStep执行后的回调SetUITexture中。(前面SetPostProcessingCallbackFunc(SetUITexture,this),已经注册)

注意SetUITexture代码细节:

 

就如此简单。哈哈。大家实现了没。。