1. 程式人生 > >Unity shader學習(一)渲染流水線

Unity shader學習(一)渲染流水線

這兩天在學習shader,記錄一下shader學習的內容,方便自己以後檢視,如果有什麼錯誤的地方,也請幫我指出共勉,謝謝!

shader的渲染流水線類似於工廠的流水線製作類似,工作任務在於由一個三維場景出發,生成(或者說是渲染)一張二維影象,這個工作通常是由cpu和gpu共同完成的

渲染流程大致可以分為三個階段,即應用階段,幾何階段,光柵化階段

應用階段:這個階段是由應用主導的,通常由cpu實現.

(1)把資料載入到視訊記憶體中

把所有需要渲染的資料從硬碟載入到系統記憶體中,網格和紋理等資料被載入到視訊記憶體中

(2)設定渲染狀態

渲染狀態即:這些狀態定義了場景中的網格是怎樣被渲染的,例如,使用哪個頂點著色器/片元著色器,光源屬性,材質等

(3)呼叫DrawCall

準備好上述工作後,CPU向命令緩衝區加入一條指令,告訴GPU"嘿.老兄,我把資料都準備好了,你可以按照我的設定來渲染了",這個渲染命令即DrawCall

幾何階段:這個階段用於處理所有和我們要繪製的幾何相關的事情,通常由GPU實現

頂點著色器->曲面細分著色器->幾何著色器->裁剪->螢幕對映

光柵化階段:這一階段將會使用上個階段傳遞的資料來產生螢幕上的畫素,並渲染出最終影象,這一階段也是在GPU上執行的

三角形設定->三角形遍歷->片元著色器->逐片元操作->螢幕影象

 

OpenGL左下角為最小視窗座標值,DirectX左上角為最小視窗座標值

減少DrawCall:

GPU的渲染能力是很強的,渲染200個還是2000個三角網格通常沒什麼區別,,因此渲染速度渲染速度往往快於CPU提交命令的速度.如果DrawCall數量太多,CPU就會把大量時間花費在提交DrawCall上,造成CPU過載.

批處理是一種很好減少DrawCall的方法把很多小的DrawCall合併成一個大的DrawCall,這就是批處理的思想,批處理技術比較適合靜態的物體,如大地,石頭等