什麼是shader?
Shader中文翻譯 着色器,是一種較爲短小的程序片段,用於高速圖形硬件如何計算和輸出圖像,過去由彙編語言來編寫,現在也可以使用高級語言來編寫,
一句話概括:shader 是可編程圖形管線的算法片段。
它主要分爲兩類,Vertex Shader和 Frament Shader
Vertex Shader 頂點處理shader(計算機中圖形都是無數個頂點組成的)
Frament Shader 片段Shader(也可以說是頂點顏色填充處理)
什麼是渲染管線?
渲染管線也稱爲渲染流水線,是顯示芯片內部處理圖形信號相互獨立的並行處理單元。一個流水線是一個序列可以並行和按照固定順序進行的階段。每個階段都從它的前一個階段結束接收輸入,然後把輸出發給隨後的階段,就像一個在同一時間內,不同階段不同汽車一起製造的裝配線,傳統的圖形硬件流水線以流水的方式處理大量的頂點,幾何圖元和片段。
Vertex處理完後 Frament 處理
如果一次渲染有100頂點要處理,一次就會同時執行100次VertexShader的調用,類似上面說的汽車裝配流水線,一次有100個車同時裝配左車門,下一步驟就是同時裝配右車門
下面是幾個流程圖
圖1 應用到展現的大概過程,GPU CPU分割線就是 調用GPUAPI 階段的一次入口
圖2 和圖1 意思大致一樣
圖3 GPU 內的流程圖,順序從左到右。
第一步
Transform 是指模型的空間變換也就是模型位置,
texGen(Texture coordinate generation ) 紋理座標生成
本來模型的紋理座標是在做模型的時候賦予各個頂點的。
但是有時模型表面非常複雜,或者要做一些特效時,就需要其他方法來生成紋理座標。
Lighting 光照
這三部是一些GPU集成好的計算過程,無法修改。
VertexShader 可以代替上面這些步驟,來自己編寫這一步驟
第二步 (不是很懂爲什麼不是之前先裁剪再進行頂點計算)
Culling 裁剪(機的剝離不需要渲染的位置,減少GPU數據處理數量進行裁剪)
Depth Test 深度測試(攝像機最近和最遠的渲染區域)
第三步
Textuing 紋理採樣,就是一個頂點上應該渲染什麼顏色值
Fog 霧化,顏色值進行二次處理,做出霧的效果
上面這兩點 也是一些GPU集成的效果 這一步可以用FragmentShader來替代
第四部
Alpha Test 進行透明測試,繪製變透明和全透明信息(不是很懂爲什麼這一步單獨進行)
第五步
(教學上沒講,我查了下,渲染透明時需要做混合,也就是幾次渲染顏色混合,尤其是透明渲染需要混合才能出來效果,類似調色板肯定需要 這個吧)
Blending 就是控制透明的。處於光柵化的最後階段。
這裏例如我們給一個模型貼一個材質,那麼在某個點計算出來顏色值稱爲源,而該點之前累積的顏色值。
渲染流程一次就是一次DC,
DrawCall 是指CPU收集數據,傳輸給GPU調用GPU一次渲染命令,合理的控制DC可以增加你的渲染性能。
總結,渲染管線就是一次渲染流程,也是經常說的Draw Call 一次DC。
Shader和材質,貼圖的關係
Shader(着色器) 實際上就是一段腳本,它負責將輸入的頂點數據以指定的方式和輸入的貼圖或者顏色算法,組合起來,然後輸出,繪製圖形單元可以依據這個輸出來將圖像繪製到屏幕上。輸入的貼圖或者顏色等,加上對應的shader,以及對 Shader的特定的參數,將這些內容打包存儲在一起,就得到一個Material 所謂的材質球,之後我們可以將材質賦予有帶有頂點信息的三維物體進行渲染輸出了。
材質好比引擎最終使用的商品,Shader好比生產這種商品的加工方法,而貼圖就是原材料。
有兩個疑問點,希望看到的牛牛們能解答我的疑惑。