Shader理論《一》渲染流水線

歡迎加入Unity業內qq交流羣:956187480

qq掃描二維碼加羣,行業縱橫頗多,每個人精通領域各異,旨在交流,


一:渲染流水線

一個完整的渲染流程分爲三個階段:應用階段,幾何階段,光柵化階段

應用階段:

此應用階段通常是由cpu負責實現的,換句話說我們這些開發者具有這個階段的絕對控制權。在這個階段有三個主要任務,首先,我們需要貯備好場景數據,例如攝像機位置角度,場景內的模型光源等等;其次爲了提高渲染性能我們需要做一個粗粒度剔除工作,最後我們需要設置每個模型的渲染狀態,這些渲染狀態包括但不限於它使用的材質(漫反射顏色,高光反射顏色),使用的紋理,shader等,這一階段中重要的是輸出渲染所需要的幾何信息,即渲染圖元,通俗講就是點線三角面等,這些渲染圖元會被傳遞給下一個階段——幾何階段。

幾何階段:

幾何階段負責和每個渲染圖元打交道,進行逐頂點,逐多邊形的操作,這一階段可以分爲更小的流水線階段,以後再說。幾何階段重要的任務就死吧頂點座標變換到屏幕空間的二維頂點座標,每個頂點對應的深度值,着色等相關信息,並傳遞給下一階段。

光柵化階段:

這個階段將會使用上個階段傳遞的數據來產生屏幕上的像素,並渲染出追蹤的圖像。這一階段跟幾何階段一樣也是在GPU上運行 的,光柵化的主要任務決定每個渲染圖元中的哪些像素應該被繪製在屏幕上,他需要對上一個階段得到的逐頂點數據(例如紋理座標,頂點顏色等)進行插值,然後進行逐像素處理。和上一個階段一樣,光柵化階段也可以細分爲更小的流水線階段

二:GPU跟CPU之間的通信

渲染流水線的起點爲cpu,即應用階段。應用階段大致分爲以下三個階段:

(1)把數據加載到顯存中

(2)設置渲染狀態

(3)調用DrawCall

把數據加載到顯存中:

所有渲染所需要的數據都需要從硬盤裏加載到系統內存裏,然後網格和紋理等數據又被加載到顯卡的存儲空間-顯存中。因爲顯卡對顯存的訪問速度更快,而且大多數顯卡對系統內存沒有直接的訪問權限,如圖

真實渲染中需要加載到顯存中的數據往往很複雜,例如頂點的位置信息,法線方向,頂點顏色,紋理座標等

當把數據加載到顯存後,系統內存中的數據就可以刪除了,但對於一些數據來說,cpu仍然需要訪問他們,那麼我就不希望這些數據被刪除,因爲從硬盤加載到系統內存的過程是很耗時間的

設置渲染狀態

通俗的講,這些狀態定義了場景中的玩個是怎樣被渲染的,例如使用哪個頂點着色器/片元着色器,光源屬性,材質等,如果我們沒有更改渲染狀態,那所有的玩個都將使用同一種渲染狀態。下圖顯示了當使用同一種渲染狀態時,渲染三個不同網格的結果

當上述工作準備好後,cpu就需要調用一個命令告訴GPU可以開始渲染了。而這個渲染命令就是DrawCall

調用DrawCall

DrawCall就是一個命令,它的發起方是CPU,接收方是GPU。這個命令僅僅會指向一個需要被渲染的圖元列表,而不會在包含任何材質信息,因爲我們在上一個階段已經完成了。當給定了一個DrawCall時,GPU就會根據渲染狀態(材質紋理着色器等)和所有的輸入的頂點數據來進行計算,最終輸出屏幕上顯示的那些漂亮的像素。而這個計算過程就是我們下一節要講的GPU流水線


歡迎加入Unity業內qq交流羣:956187480

qq掃描二維碼加羣,行業縱橫頗多,每個人精通領域各異,旨在交流,

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章