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().
本文详细介绍了在Ogre引擎中如何利用TextureManager和RenderTarget类实现渲染到纹理(RTT)的功能,包括创建纹理、设置视口、创建材质、应用材质到物体以及解决子窗口渲染问题的方法。
102

被折叠的 条评论
为什么被折叠?



