Ogre中可以渲染到纹理,这如同渲染到屏幕上一样,具体的使用方法是:
1 先创建一个纹理,用于接受渲染的内容
TexturePtr renderTexture=TextureManager::getSingleton().createManual("RT",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,TEX_TYPE_2D,window->getWidth(), window->getHeight(), 0, PF_R8G8B8, TU_RENDERTARGET);
2从这个纹理创建一个rendertarget类
RenderTarget *textureTarget=renderTexture->getBuffer()->getRenderTarget();
3在这个渲染目标上加视口(如同在window上加视口一样)
Viewport*rv=textureTarget->addViewport(cam);
rv->setClearEveryFrame(true);
rv->setBackgroundColour(ColourValue::Blue);
rv->setOverlaysEnabled(false);
4创建一个使用这个纹理的material
MaterialPtr renderMaterial=MaterialManager::getSingleton().create("RM",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
renderMaterial->getTechnique(0)->getPass(0)->createTextureUnitState("RT");
这样使用这个material就可以实时的被渲染了
5将这个材质给一个物体
xxx->setMaterialName("RM");
6 如果只这样做,可能会出现这样的现象,比如你在场景中创建了一个子窗口,他也显示整个场景的内容,有时在这个子窗口中也会出现子窗口,因为子窗口也被作为渲染物渲染到子窗口上,所以在RTT中有一个类是RenderTargetListener类,来解决这个问题,这个类用来监听RTT事件,需要override它的两个主要函数preRenderTargetUpdate(),这是在纹理被绘制前的一瞬产生,这时你通常的做法是要隐藏子窗口,还有一个postRenderTargetUpdate(),这个在纹理被刚好绘制好之后执行,这里要做的就是再显现子窗口。当然,为了让这个监听器工作,你需要调用textureTarget->addListener().