realiseGeometry();
这个主要更改的是代表当前surface的纹理,可以参照cegui的例子EffectDemo
有一个前提就是Window::d_autoRenderingWindow为true
因为只有一个窗口单独自己持有一个纹理的时候,你设置的effect会被设置到自己的renderingwindow
Window::drawSelf(ctx);
这个需要自定义一个基于Window或者现有控件类型的类,并且重新实现Window::drawSelf
在drawself里将自己实现的geometrybuffer添加到surface的渲染队列里
响应一个事件,在绘制的时候直接绘制到对应的RenderingWindow上
CEGUI::System::getSingleton().getDefaultGUIContext().<br> subscribeEvent(CEGUI::RenderingSurface::EventRenderQueueStarted,
实现一个RenderEffect,重写performPreRenderFunctions或者performPostRenderFunctions
<p>void Direct3D9GeometryBuffer::draw() const<br>{<br> RECT saved_clip;<br> d_device->GetScissorRect(&saved_clip);</p><p> // setup clip region<br> RECT clip;<br> clip.left = static_cast<LONG>(d_clipRect.left());<br> clip.top = static_cast<LONG>(d_clipRect.top());<br> clip.right = static_cast<LONG>(d_clipRect.right());<br> clip.bottom = static_cast<LONG>(d_clipRect.bottom());</p><p> // apply the transformations we need to use.<br> if (!d_matrixValid)<br> updateMatrix();</p><p> d_device->SetTransform(D3DTS_WORLD, &d_matrix);</p><p> d_owner.setupRenderingBlendMode(d_blendMode);</p><p> const int pass_count = d_effect ? d_effect->getPassCount() : 1;<br> for (int pass = 0; pass < pass_count; ++pass)<br> {<br> // set up RenderEffect<br> if (d_effect)<br> d_effect->performPreRenderFunctions(pass);</p><p> // draw the batches<br> size_t pos = 0;<br> BatchList::const_iterator i = d_batches.begin();<br> for ( ; i != d_batches.end(); ++i)<br> {<br> if (i->clip)<br> d_device->SetScissorRect(&clip);</p><p> d_device->SetTexture(0, i->texture);<br> d_device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, i->vertexCount / 3,<br> &d_vertices[pos], sizeof(D3DVertex));<br> pos += i->vertexCount;</p><p> if (i->clip)<br> d_device->SetScissorRect(&saved_clip);<br> }<br> }</p><p> // clean up RenderEffect<br> if (d_effect)<br> d_effect->performPostRenderFunctions();<br>}</p><p></p>
实现 d_effect->performPreRenderFunctions(pass);影响的是前绘制
实现d_effect->performPostRenderFunctions();影响的是后绘制
这样的控件必须单独持有一个纹理,所以一定能够获得一个renderingwindow,setRenderEffect
void RenderingWindow::setRenderEffect(RenderEffect* effect)<br>{<br> d_geometry->setRenderEffect(effect);<br>}子主题
无论实现哪个函数<br>d_effect->performPreRenderFunctions(pass);还是<br>d_effect->performPostRenderFunctions();<br>他们本质上都是绘制到上一层renderwindowing上,如果你用固定管线绘制,不用设置矩阵,自然就可以默认绘制到当前纹理上,如果使用HLSL,千万记得获取设置矩阵<br>