您好,登錄后才能下訂單哦!
頂點著色器是流水線的第一個階段,它的輸入來自于CPU。頂點著色器的處理單位是頂點,也就是說輸入進來的每個頂點都會調用一次頂點著色器。
頂點著色器需要完成的工作主要有:坐標變換和逐頂點光照。當然,除了這兩個主要任務外,頂點著色器還可以輸出后續階段所需的數據。
坐標變換,顧名思義,就是對頂點的坐標進行某種變換。例如我們可以通過改變頂點位置來模擬水面,布料等。
一個最基本的頂點著色器必須完成的一個工作是:把頂點坐標從模型空間轉換到齊次剪裁空間。類似下面代碼:
o.pos=mul(UNITY_MVP,v.position);
由于我們的場景可能會很大,而攝像機的視野范圍很有可能不會覆蓋所有的場景物體,一個很自然的想法就是,那些不在攝像機視野范圍內的物體不需要被處理,而裁剪就是為了完成這個目的而被提出來的。
一個圖元和攝像機的關系有3種:
完全在視野內
部分在視野內
完全在視野外
部分在視野內的圖元需要裁剪,例如一條線段的一個頂點在視野內,而另一個頂點在視野外,那么視野外部的頂點應該使用一個新的頂點來代替,這個新的頂點位于這條線段和視野邊界的交點處。
這一步輸入的坐標仍然是三維坐標系。屏幕映射的任務是把每個圖元的x和y坐標轉換到屏幕坐標系下,屏幕坐標系是一個二維坐標系,它和我們用于顯示畫面的分辨率有很大關系。
屏幕映射得到的屏幕坐標決定了這個頂點對應屏幕上哪個像素以及距離這個像素有多遠。
opengl的屏幕坐標原點是左下角,而directx是左上角,如果你發現你得到的圖像是倒轉的,那么很有可能就是這個原因造成的。
由這一步就進入了光柵化階段,從上一個階段輸出的信息是屏幕坐標下的頂點位置以及和它們相關的額外信息,如深度值、法線方向、視角方向等,光柵化有兩個最重要的目標:計算每個圖元覆蓋了哪些像素,以及為這些像素計算他們的顏色。光柵化的第一個流水線階段是三角形設置,這個階段會計算光柵化一個三角網格所需的信息。
具體來說,上一個階段輸出的都是三角網格的頂點,即我們得到的是三角網格每條邊的兩個端點。但如果要得到整個三角網格對像素的覆蓋情況,我們就必須計算每條邊上的像素坐標。為了能夠計算邊界像素的坐標信息,我們就需要得到三角形邊界的表示方式。這樣一個計算三角形網格表示數據的過程就叫做三角形設置,它的輸出是為了下一個階段做準備。
三角形遍歷階段將會檢查每個像素是否被一個三角形網格所覆蓋。如果被覆蓋的話,就會生成一個片元,而這樣一個找到哪些像素被三角網格覆蓋的過程就是三角形遍歷,這個階段也被稱為掃描變換。
三角形遍歷階段會根據上一個階段的計算結果來判斷一個三角網格覆蓋了哪些像素,并使用三角網格3個頂點的頂點信息對整個覆蓋區域的像素進行插值。
片元著色器是另一個非常重要的可編程著色器階段,片元著色器的輸入是上一個階段對頂點信息插值得到的結果,更具體來說,是根據那些從頂點著色器輸出的數據插值得到的。而它的輸出是一個或多個顏色值。
這一階段可以完成很多重要的的渲染技術,其中最重要的技術之一就是紋理采樣。為了在片元著色器中進行紋理采樣,我們通常會在頂點著色器階段輸出每個頂點對應的紋理坐標,然和經過光柵化階段對三角網格的3個頂點對應的紋理坐標進行插值后,就可以得到其覆蓋的片元的紋理坐標了。
逐片元操作是opengl中的說法,在directx中,這一階段被稱為輸出合并階段。
這一階段有幾個主要任務:
決定片元的可見性。涉及很多測試工作,如深度測試,模版測試等。
如果一個片元通過了所有的測試,就需要把這個片元的顏色值和已經存儲在顏色緩沖區中的顏色進行合并
至此,整個GPU渲染管線就結束了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。