Opengl中的FBO渲染到紋理

2021-06-27 14:22:19 字數 2293 閱讀 6647

渲染到紋理用途:遊戲中水的倒影,汽車的反光鏡,gpgpu必備。

實現參見紅皮書的

至於ogre中的渲染到紋理可以參考翻譯文件第八章《ogre渲染目標》

「渲染到紋理」技術,本質上來說就是一次對場景中幾何體的渲染過程。它本身要花費一些執行時間,進而導致幀速的下降。當你渲染複雜耗時的內容的時候,你不得不考慮相關的效率問題。不過,為了實現一些特殊的效果,又不能不使用「渲染到紋理」技術。比如我們將要在12章中介紹的實時陰影以及動態反射之類的特效都需要紋理渲染目標的支援。雖然在前面材質章節時候介紹過一種簡單的靜態反射材質,但它卻不能反射動態的物體的「倒影」。如果這時候使用了紋理渲染目標來表現反射,就能很好的處理諸如水面上划行的船在水面的「倒影」此類的動態效果。另外一種紋理渲染目標比較擅長的領域是3d gui的實現。你可以選擇把2d的gui畫面渲染到3d的空間幾何體上面,或者把3d的物體渲染到2d的gui上面。紋理渲染目標都可以良好的幫你實現。

**舉例 :紋理物件的建立過程。其中pf_r8g8b8描述了乙個24位無alpha通道的顏色格式。方法返回了乙個指向紋理資源的智慧型指標。注意最後乙個引數必須為 tu_rendertarget ,這個紋理是乙個渲染目標。換句話說,你把乙個目標渲染到這個紋理上。

**8-3建立乙個512x512,24-bit,名字為rtttex的紋理渲染目標

textureptr texture = texturemanager::getsingleton().createmanual( "rtttex", 

resourcegroupmanager::default_resource_group_name, tex_type_2d, 

512, 512, 0, pf_r8g8b8, tu_rendertarget );

我們設定了乙個攝象機和視口用於把場景內容渲染到目標紋理上。

**8-4建立乙個攝象機和視口用來把場景內容渲染到紋理

rendertarget *rtttex = texture->getbuffer()->getrendertarget();

// give the plane a texture

mplaneent->setmaterialname("rttmat");

在**8-6中,我們首先把攝像機設定為映象狀態。並且我們在引數中指定了作為「鏡子」的平面。如你所見,這個平面即用來渲染反射紋理,同時也用來作為反射表面的分界。平面會如同鏡子般反射所有平面上面的內容。這種方法比較常用於模擬水面的反射,你可以想象這樣乙個畫面,碧綠的湖面對映著周圍美麗的風景。這和本演示程式的基本原理是相同的。

對攝像機近截面(near clip plane)的設定突然出現在這裡可能會讓人感覺有一些突兀。但是這裡確實需要乙個「截面」,否則你會把反射表面下面的內容(那些你不希望被反射的東西)也渲染到表面,在這裡我們同樣用鏡面所在的平面作為近截面來截去這些物體。但是這裡沒有使用「使用者自定義截面」,而是通過改變視截體的近截面來達到同樣的效果。這是因為並不能保證「使用者自定義截面」在所有硬體上都能夠正確的實現,而視截體的「近截面」可以。並且就算在能實現「使用者自定義截面」的硬體上,視截體的「近截面」會有更高的渲染效率。雖然拉遠近截面會讓深度快取的精度有所下降,不過在大多數時候並不會對顯示效果有明顯的影響(畢竟我們只是在紋理上作渲染工作)。

**8-6最後一行把我們所用平面的實體和反射材質繫結到一起。

另外一部分對渲染的處理工作發生在每一幀渲染的時候。也就是在場景內容渲染到紋理的時候。請參看**8-7。

**8-7在渲染前隱藏平面,然後在渲染結束後讓它可見

// render target events

void prerendertargetupdate(const rendertargetevent& evt)

void postrendertargetupdate(const rendertargetevent& evt)

最後需要注意的是,為了讓紋理渲染出來的結果和我們的視點相同,在執行的每一幀都要用更新反射攝像機的位置。

// make sure reflection camera is updated too

mreflectcam->setorientation(mcamera->getorientation());

mreflectcam->setposition(mcamera->getposition());

如果使用者更新了主攝像機的位置,我們的反射攝像機也會完全的跟隨,這樣就能保證反射的結果對應於我們當前的視點。

FBO 渲染到紋理

這是書中第八章的最後一節內容,在我機制的簡化問題後,寫出了想要的效果.應用fbo渲染到紋理,可以直接用.這個用來實現鏡面效果什麼的,好啊.再乙個,貌似我現在已經可以去寫延遲渲染流水線了,那個用到多渲染目標,之後再處理.呼,繼續學習吧,這些東西還真得實踐才行啊.rendertotexture.cpp ...

Opengl中的FBO物件

文章 概要 在opengl的渲染管線中,幾何資料和紋理通過一系列變換和測試,最終被渲染成螢幕上的二維畫素。那些用於儲存顏色值和測試結果的二維陣列的幾何被稱為幀緩衝區 frame buffer 這些二維陣列按用途劃分,可分為顏色緩衝區 color buffer 深度緩衝區 depth buffer 模...

OpenGL中的FBO物件(含原始碼)

概要 在opengl的渲染管線中,幾何資料和紋理通過一系列變換和測試,最終被渲染成螢幕上的二維畫素。那些用於儲存顏色值和測試結果的二維陣列的幾何被稱為幀緩衝區 frame buffer 這些二維陣列按用途劃分,可分為顏色緩衝區 color buffer 深度緩衝區 depth buffer 模版緩衝...