Shader學習基礎之一(圖形流水線)
基礎篇(一)
圖形程式設計硬體:
歷史:圖形程式設計硬體誕生自2003年,簡稱為GPU程式設計
支援功能:
1.支援頂點和片段的可程式設計能力
2.支援IEEE32位的浮點運算(IEEE32是國際電工委員會置頂的浮點書表示方式,主要內容是用四個位元組來表示浮點數,可以表示的資料的負數範圍是(-2*2)^128~-2^127,2^-127~2*2^128)
3.支援四元向量和四階矩陣
4.提供分支和迴圈的控制語句
5.具有高頻寬的記憶體處理能力
6.支援1D,2D,3D的紋理查詢和使用能力,而且速度非常塊
7.支援繪製到紋理功能
GPU和CUP的關係:
GUP具有高並行的結構,所以在處理圖形資料和複雜演算法比CUP更加有效率。
CPU在執行任務的時候,一個時刻只會處理一個數據,不存在真正意義上的並行,而GPU則有多個處理器核,在一個時刻可以並行處理多個數據。
為什麼GPU不能代替CPU?
因為在GPU上我們無法處理資料之間的相關性的演算法,簡而言之,我們在書寫C#程式的時候可以很輕鬆的處理資料與資料之間的關係,而在Shader上我們則沒法實現,因為shader上面的每個屬性都是獨立的。
GPU圖形渲染管線:
圖形渲染管線描述GPU的渲染流程:給點視點,三維物體,光源,光照模型和紋理等元素,如何繪製一個2D的圖形。
圖形渲染管線分為三個階段:應用程式階段,幾何階段,光柵階段
應用程式階段:
主要使用高階的程式語言進行開發,例如C,C++等
輸出:通過資料匯流排,把幾何體的資料(頂點座標,法向量,紋理座標,紋理等)傳送到圖形硬體。
幾何階段:
輸入:應用程式末端輸出的內容
負責任務:頂點座標變換,光照,裁剪,投影以及螢幕對映
輸出:經過變換和投影之後的螢幕座標,顏色,以及紋理座標。
問題:為什麼需要對三維空間的頂點進行座標空間的變換呢?
答:其實輸入到計算機當中的是一系列的三維座標的點,但是我們看到的螢幕是一個二維座標的點,所以需要轉換。
座標空間型別:ObjectSpace模型空間-WorldSpace世界空間-EyeSpace觀察空間-ClipAn’dProjectSpace螢幕空間
圖中,我們的物體是O,他有一個自己的座標系,就是物體座標系(ObjectSpace)。
第一步:我們需要先把物體上的頂點座標轉換到世界座標系(WorldSpace)中,這個部分我們需要乘一個矩陣,在Unity中這部分我們一般需要左乘矩陣(_object2world),這時我們拿到的頂點座標就是世界座標系的物體座標!
第二步:我們需要把世界空間的座標轉換到我們眼睛所在的座標系,這樣才能共人眼看到,當然,在軟體裡面,人眼的代表就是攝像機,我們都知道人眼只能看到一個方向,而且太遠的地方和太近的地方看不到,那麼我們就可以用視角,視線方向,遠近裁剪平面來模擬一個視錐體。
在這個視錐體之外的所有東西都將要被裁剪,因為程式認為它是不可見的。在這個部分,我們會為每個頂點確定一個深度。
單位立方體:對角頂點分別是(1,1,1)和(-1,-1,-1)也被稱為規範立方體(CVV)。
CVV的近平面(梯形的較小的平面)對應的是螢幕座標的xy座標,z對應的就是深度。
1,我們通常所說的投影就是透視變換矩陣把頂點從視錐體變換到CVV中。
2,在CVV中進行裁剪
3,螢幕對映,講上邊所得到的座標對映到螢幕座標系當中
投影:有平行投影和透視
圖元裝配:
輸入:頂點的資訊
含義:將頂點根據原始的連線關係,還原出網格結構。
這一階段會得到很多的小三角形,關於三角形頂點的順序:我們用右手法則來確定三角形的法向量,如果該向量朝向視點(法向量與到視點的方向點積為正),則這一面是正面,一般頂點按照逆時針排列,一般背面我們是看不到的,就會進行剔除操作,原因是為了減少頂點個數。
裁剪演算法:視域剔除,背面剔除,遮擋剔除,視口裁剪
這一過程得到一堆在螢幕座標系中的三角形面片。
光柵化階段:
決定哪些畫素被幾何圖元覆蓋的過程。
輸入資料:螢幕座標系的頂點值以及我們需要繪製的圖元
階段一:將頂點以及繪製的圖元(線,面)對應到相應的畫素座標
階段二:片段操作,在更新幀快取之前
a.消除遮擋面
b.紋理操作,根據畫素的紋理座標,查詢對應的紋理值
c.混色,根據目前已經畫好的顏色與正在計算的顏色透明度,混合兩種顏色作為新的顏色輸出。
為了在場景中繪製透明物體,通常都需要對物體進行排序,首先繪製不透明物體,然後,在不透明物體的上方,對不透明物體進行由後到前的順序進行混合處理。
圖形過濾器:講正在計算的顏色通過某種濾鏡之後輸出
最後將顏色寫入幀快取!
三種語言:
Opengl的GLSL
Dirrect3D的HLSL
NVIDIA的CG
為什麼我們的unity中要使用CG語言?
因為CG編寫的程式可以同時相容Opengl和Direct3D兩種平臺,恰巧我們unity製作需要支援多種平臺。
GPU上的兩個元件:
可程式設計頂點處理器和可程式設計片段處理器
頂點和片段著色器擁有強大的平行計算能力,擅長不高於4階的矩陣運算,片段著色器還支援高速的紋理查詢能力。
頂點著色器:
輸入:GPU前端模組提取圖元資訊(頂點位置,法線向量,紋理座標(uv))等
操作:頂點座標空間轉換,法向量空間轉換,光照計算等(現在光照計算一般在片段著色器,比較細),然後將計算好的資料傳入指定暫存器中
片段著色器:
輸入:頂點著色器傳入的資料
操作:光照計算,uv擾動,紋理取樣等,最後輸出當前片段的顏色給光柵化階段(片段著色器是對每個獨立的顏色進行操作的)
片段和畫素的區別:所謂片段是所有三位定點在光柵化之後的資料集合,這些資料還沒有經過深度值比較,而螢幕顯示的畫素都是經過深度比較的。