Ogre:render to texture

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().


轉載自:http://blog.csdn.net/leonwei/article/details/5740728

發佈了95 篇原創文章 · 獲贊 34 · 訪問量 59萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章