2 渲染流水線
image.png
應用階段-幾何階段-光柵化階段
應用階段
由CPU負責,輸出渲染所需的幾何信息,即 渲染圖元(rendering primitives)幾何階段
由GPU負責,把頂點坐標變換到屏幕空間中,再交給光柵器處理;輸出屏幕空間的二維頂點坐標、每個頂點對應的深度值、著色等信息,傳遞到下一階段光柵化階段
在GPU上進行,光柵化主要任務是決定每個渲染圖元中的哪些像素應該被繪制在屏幕上。對上階段的逐頂點數據(如紋理坐標、頂點顏色等)進行插值,再進行逐像素處理。
2.2 CPU與GPU通訊
- 應用階段又可以分為:
- 把數據加載到顯存
- 設置渲染狀態
- 調用Draw Call
1. 把數據加載到顯存
image.png
2. 設置渲染狀態
什么是渲染狀態?通俗解釋:這些狀態定義了場景中的網格是怎樣被渲染的
3. 調用Draw Call
image.png
Draw Call就是一個命令,發起方是CPU接收方是GPU。只是一個命令,不會包含任何材質信息
2.2 GPU流水線
GPU流水線即幾何階段和光柵化階段,又可以分成若干更小的流水線,這些流水線由GPU來實現,每個階段GPU提供了不同的可配置性或可編程性。
GPU流水線
#######幾何階段:
- 頂點著色器(Vertex Shader)是完成可編程的,它通常用于實現頂點的空間變換、頂點著色等功能。
- 曲面細分著色器 (Tessellation Shader)是一個可選的著色器,用于細分圖元。
- 幾何著色器(Geometry Shader)是一個可選的著色器,可以被用于執行逐圖元的著色操作,或者用于產生更多圖元。
- 裁剪(Clipping)目的是將那些不在攝像機視野內的頂點裁減掉,并剔除某些三角圖元的片面,這個階段是可配置的。
- 屏幕映射(Screen Mapping)不可配置和編程,負責吧每個圖元的坐標轉換到屏幕坐標系中。
#######光柵化階段: - 三角形設置 和三角形便利,是固定函數階段;
- 片元著色器(Fragment Shader)完全可編程,用于實現逐片元(Per-Fragment)的著色操作。
- 逐片元操作(Per-Fragment Operations)階段負責執行很多重要的操作,例如修改顏色、深度緩沖、進行混合等,它是不可編程的,但具有很高的可配置性。
2.3.2 頂點著色器:
- 輸入進來的每個頂點都會調用一次頂點著色器,頂點著色器本身不可以創建或者銷毀任何頂點,無法得到頂點之間的關系。正式因為相互獨立性,GPU可以利用本身的特性并行化處理每個頂點。
-
主要工作:坐標變換和逐頂點光照。
頂點著色器進行坐標變換并計算頂點顏色的過程 -
必須完成的工作:把頂點坐標從模型空間轉換到齊次裁剪空間
轉換齊次裁剪坐標系
2.3.3 裁剪:
- 無法通過編程空值裁剪過程,但可以定義一個裁剪操作來對這一步進行配置。
2.3.3 屏幕映射(Screen Mapping):
- 把每個圖元的x和y坐標轉換到屏幕坐標系(Screen Coordinates
)下,屏幕坐標系是一個二位坐標系,它和我們用于顯示畫面的分辨率有很大關系。
2.3.5 三角形設置:
- 由這一步開始進入了光柵化階段。上一階段輸出的信息是屏幕坐標系下的頂點位置以及和它相關的額外信息,如深度值(z坐標)、法線法相、視角方向等。光柵化有兩個最重要的目標:計算每個圖元覆蓋了哪些像素,以及為這些像素計算他們的顏色。
- 三角形設置:計算光柵化一個三角形網格所需的信息。