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,這就是批處理的思想,批處理技術比較適合靜態的物體,如大地,石頭等