1. 程式人生 > 其它 >Unity Shader:(一)渲染流水線

Unity Shader:(一)渲染流水線

一個分享著色器的網站https://www.shadertoy.com/

什麼是Shader? GPU流水線上一些可高度程式設計的階段。

一、渲染流水線(概念上)

應用階段 ----輸--出--渲--染--圖--元----> 幾何階段 -------輸--出--屏--幕--空--間--頂--點--信--息---> 光柵化階段

準備場景資料 把頂點座標變換到螢幕空間中 對上一階段頂點資料進行插值,再逐畫素處理

粒度剔除culling GPU上執行 決定每個渲染圖元中的哪些畫素應該被繪製在螢幕上

設定渲染狀態 GPU上執行

CPU上執行

<-------------應用階段:CPU和GPU之間的通訊------------>

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

2. 設定渲染狀態

3. 呼叫DrawCall

DrawCall是一個Cpu發起的發向GPU的命令。這個命令會指向本次呼叫需要渲染的圖元列表。

為什麼DrawCall多了會影響幀率?渲染速度往往快於CPU提交命令的速度,DrawCall數量太多,會把大量時間花費在提交DrawCall上。

那麼如何減少DrawCall?批處理,靜態物體只合並一次。(避免使用大量很小的網格。避免使用過多的材質。)

二、GPU流水線(實際上)

----------------------------------------幾----何----階----段-------------------------------------------

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

------------------------------------------------------------------------------------------------------------

1. 流水線第一階段:頂點著色器 Vertex Shader 完全可程式設計

主要工作:座標變換、逐頂點光照

座標變換:把頂點座標從模型空間轉換到齊次剪裁空間。例如

o.pos = mul ( UNITY_MVP, v.position );

2. 裁剪:不在攝像機視野的頂點裁減掉。可配置但不可程式設計。

3. 螢幕對映:把每個圖元的座標轉換到螢幕座標系。不可配置不可程式設計。

------------------------------------光----柵----化----階----段-----------------------------------------

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

------------------------------------------------------------------------------------------------------------

1. 片元著色器 Fragment Shader 完全可程式設計

主要工作:逐片元的著色操作。

2. 逐片元操作 執行修改顏色、深度緩衝、進行混合等等重要操作。可配置但不可程式設計。

-------------------------------------------------------------------------------------------------------------------------------------------------------

內容參考《UnitySahder入門精要》