閱讀724 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

最後更新:2017-04-02 06:51:20

  上一篇:go KPI(Key Performance Indicators )
  下一篇:go 關於程序集生成失敗 -- 引用的程序集沒有強名稱的解決辦法