CEGUI渲染流程簡析

2021-06-04 19:06:12 字數 2368 閱讀 7260

粗略分析了cegui的渲染流程,總結一下供日後參考。cegui版本是0.7.5,opengl渲染器。

首先在cegui裡面每張,每個字元都是乙個quad,每個quad由2個三角面組成,包括6個頂點的座標,顏色,紋理座標,是傳送給gpu的最基礎的渲染單元。要注意的是,cegui並不侷限於quad,它可以構造任意多的三角面以生成各種形狀。要繪製乙個視窗需要很多頂點資料,例如乙個簡單的button,背景影象需要1個quad(根據背景型別不同可能會更多),有4個文字的話又需要4個quad,總共就有5個quad,30個頂點。所以每個window物件都有乙個geometrybuffer物件用來快取自己的頂點資料。

視窗繪製輸出的目的地稱為renderingsu***ce,所以每個視窗都要從屬於某個renderingsu***ce,否則無法顯示。在渲染的時候,cegui會遍歷所有的視窗,並將該視窗的geometrybuffer依次提交到該視窗所屬su***ce的渲染佇列中去。對於cegui來說,這個過程就是「視窗繪製」,同時會觸發繪製訊息,而真正的繪製操作其實是在這之後。當所有相關的geometrybuffer都被push進佇列,renderingsu***ce::draw就會被呼叫,此時頂點資料才真正提交到renderer進行渲染輸出。renderer輸出的目的地稱為rendertarget,由具體實現而定,可能是frame buffer,off-screen buffer,或者texture object。在當前openglrenderer中,是用紋理物件來實現的。之所以要引入rendertarget,是為了能快取su***ce的輸出。

renderingsu***ce有兩個派生類,乙個是renderingroot,它是renderer預設的su***ce型別,在當前cegui的實現中只是對renderingsu***ce的簡單封裝,沒有任何額外的功能;第二個是renderingwindow,它的作用是將渲染佇列中的內容繪製到一張紋理影象上面,然後再用該紋理來繪製自己的geometrybuffer到其他su***ce上面去。cegui 0.7中新增的視窗旋轉和各種視窗特效就是通過這種方式來實現的。

在cegui中,每個window物件都有自己的geometrybuffer,但並不是每個視窗都有自己的su***ce。對於普通的四平八穩的視窗,它們共享由renderer建立的renderingroot物件;而只有使用了旋轉或特效的視窗才會建立屬於自己的renderingwindow(不要忘記,這是乙個su***ce派生類哦)。成員函式window::gettargetrenderingsu***ce用於獲取視窗物件的su***ce,從中可以看出su***ce的從屬關係:

renderingsu***ce& window::gettargetrenderingsu***ce() const

實際的渲染呼叫流程從system::rendergui開始,它首先清空頂層視窗的su***ce渲染佇列,然後呼叫頂層視窗的window::render函式:

void window::render()

// 如果是自己的su***ce則提交geometrybuffer到gpu進行渲染輸出

if (ctx.owner == this)

ctx.su***ce->draw();

}

在window::drawself中:

void window::drawself(const renderingcontext& ctx)

void window::buffergeometry(const renderingcontext&)

}

值得注意的是,cegui會記錄各種視窗狀態,只有在需要的時候才會重新構建視窗物件的geometrybuffer,同樣只有在需要的時候,才會重新繪製renderingsu***ce。

上面**中還提到了windowrenderer(注意區分renderingwindow)。這個class的作用是根據looknfeel的描述來生成生成頂點資料。在ceguifalagardwrbase工程下面有一大堆fal開頭的class,例如falbutton,faleditbox等等,就是專門幹這些工作的。經過windowrenderer的層層呼叫,最終會落到以下三個component上面:

framecomponent:生成邊框和背景

imagerycomponent:生成靜態影象

textcomponent:生成文字

這幾個component都是由falagardcomponentbase繼承而來,作用是根據各種不同的配置,例如背景的樣式,是否是邊框,文字的排版方式等等,生成頂點資料。

綜上,cegui的控制項邏輯,控制項樣式,渲染資料是完全分離的。渲染部分採用兩級快取。第一級快取用於記錄頂點資料(geometrybuffer);第二級快取將渲染結果儲存在紋理上面(renderingsu***ce)。

gkENGINE HDR流程簡析

個人比較喜歡看圖說話。這裡簡單的用圖和文字說明一下gkengine hdr渲染流程中的關鍵步驟。如果要一步一步的解析,光是解釋rt的建立,釋放,紋理格式的選用。可能就需要一整天。如果再設計到框架搭建,shader的實際處理,可能幾天都不夠。所以這裡就不詳細進行 層面的講解了。不過這裡列舉幾個非常關鍵...

python 簡析程式控制流程

python程式中語句執行的順序包括3種基本控制結構 順序結構 選擇結構 迴圈結構。1 順序結構 程式中語句執行的基本順序按各語句出現位置的先後次序執行,稱為順序結構,參見下圖。先執行語句塊1,再執行語句塊2,最後執行語句塊3。三者是順序執行關係。2 選擇結構 選擇結構可以根據條件來控制 的執行分支...

python 簡析程式控制流程

python程式中語句執行的順序包括3種基本控制結構 順序結構 選擇結構 迴圈結構。1 順序結構 程式中語句執行的基本順序按各語句出現位置的先後次序執行。2 選擇結構 選擇結構可以根據條件來控制 的執行分支。分支結構包括 單分支 雙分支和多分支,2.1 單分支結構 if語句單分支結構的語法如下所示 ...