溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

GPU渲染管線概述

發(fā)布時間:2020-07-13 17:15:13 來源:網(wǎng)絡(luò) 閱讀:243 作者:26度出太陽 欄目:網(wǎng)絡(luò)安全

1.頂點(diǎn)著色器

頂點(diǎn)著色器是流水線的第一個階段,它的輸入來自于CPU。頂點(diǎn)著色器的處理單位是頂點(diǎn),也就是說輸入進(jìn)來的每個頂點(diǎn)都會調(diào)用一次頂點(diǎn)著色器。
頂點(diǎn)著色器需要完成的工作主要有:坐標(biāo)變換和逐頂點(diǎn)光照。當(dāng)然,除了這兩個主要任務(wù)外,頂點(diǎn)著色器還可以輸出后續(xù)階段所需的數(shù)據(jù)。
坐標(biāo)變換,顧名思義,就是對頂點(diǎn)的坐標(biāo)進(jìn)行某種變換。例如我們可以通過改變頂點(diǎn)位置來模擬水面,布料等。
一個最基本的頂點(diǎn)著色器必須完成的一個工作是:把頂點(diǎn)坐標(biāo)從模型空間轉(zhuǎn)換到齊次剪裁空間。類似下面代碼:

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

2.裁剪

由于我們的場景可能會很大,而攝像機(jī)的視野范圍很有可能不會覆蓋所有的場景物體,一個很自然的想法就是,那些不在攝像機(jī)視野范圍內(nèi)的物體不需要被處理,而裁剪就是為了完成這個目的而被提出來的。
一個圖元和攝像機(jī)的關(guān)系有3種:

  • 完全在視野內(nèi)

  • 部分在視野內(nèi)

  • 完全在視野外
    部分在視野內(nèi)的圖元需要裁剪,例如一條線段的一個頂點(diǎn)在視野內(nèi),而另一個頂點(diǎn)在視野外,那么視野外部的頂點(diǎn)應(yīng)該使用一個新的頂點(diǎn)來代替,這個新的頂點(diǎn)位于這條線段和視野邊界的交點(diǎn)處。

3.屏幕映射

這一步輸入的坐標(biāo)仍然是三維坐標(biāo)系。屏幕映射的任務(wù)是把每個圖元的x和y坐標(biāo)轉(zhuǎn)換到屏幕坐標(biāo)系下,屏幕坐標(biāo)系是一個二維坐標(biāo)系,它和我們用于顯示畫面的分辨率有很大關(guān)系。
屏幕映射得到的屏幕坐標(biāo)決定了這個頂點(diǎn)對應(yīng)屏幕上哪個像素以及距離這個像素有多遠(yuǎn)。
opengl的屏幕坐標(biāo)原點(diǎn)是左下角,而directx是左上角,如果你發(fā)現(xiàn)你得到的圖像是倒轉(zhuǎn)的,那么很有可能就是這個原因造成的。

4.三角形設(shè)置

由這一步就進(jìn)入了光柵化階段,從上一個階段輸出的信息是屏幕坐標(biāo)下的頂點(diǎn)位置以及和它們相關(guān)的額外信息,如深度值、法線方向、視角方向等,光柵化有兩個最重要的目標(biāo):計算每個圖元覆蓋了哪些像素,以及為這些像素計算他們的顏色。光柵化的第一個流水線階段是三角形設(shè)置,這個階段會計算光柵化一個三角網(wǎng)格所需的信息。
具體來說,上一個階段輸出的都是三角網(wǎng)格的頂點(diǎn),即我們得到的是三角網(wǎng)格每條邊的兩個端點(diǎn)。但如果要得到整個三角網(wǎng)格對像素的覆蓋情況,我們就必須計算每條邊上的像素坐標(biāo)。為了能夠計算邊界像素的坐標(biāo)信息,我們就需要得到三角形邊界的表示方式。這樣一個計算三角形網(wǎng)格表示數(shù)據(jù)的過程就叫做三角形設(shè)置,它的輸出是為了下一個階段做準(zhǔn)備。

5.三角形遍歷

三角形遍歷階段將會檢查每個像素是否被一個三角形網(wǎng)格所覆蓋。如果被覆蓋的話,就會生成一個片元,而這樣一個找到哪些像素被三角網(wǎng)格覆蓋的過程就是三角形遍歷,這個階段也被稱為掃描變換。
三角形遍歷階段會根據(jù)上一個階段的計算結(jié)果來判斷一個三角網(wǎng)格覆蓋了哪些像素,并使用三角網(wǎng)格3個頂點(diǎn)的頂點(diǎn)信息對整個覆蓋區(qū)域的像素進(jìn)行插值。

6.片元著色器

片元著色器是另一個非常重要的可編程著色器階段,片元著色器的輸入是上一個階段對頂點(diǎn)信息插值得到的結(jié)果,更具體來說,是根據(jù)那些從頂點(diǎn)著色器輸出的數(shù)據(jù)插值得到的。而它的輸出是一個或多個顏色值。
這一階段可以完成很多重要的的渲染技術(shù),其中最重要的技術(shù)之一就是紋理采樣。為了在片元著色器中進(jìn)行紋理采樣,我們通常會在頂點(diǎn)著色器階段輸出每個頂點(diǎn)對應(yīng)的紋理坐標(biāo),然和經(jīng)過光柵化階段對三角網(wǎng)格的3個頂點(diǎn)對應(yīng)的紋理坐標(biāo)進(jìn)行插值后,就可以得到其覆蓋的片元的紋理坐標(biāo)了。

7.逐片元操作

逐片元操作是opengl中的說法,在directx中,這一階段被稱為輸出合并階段。
這一階段有幾個主要任務(wù):

  • 決定片元的可見性。涉及很多測試工作,如深度測試,模版測試等。

  • 如果一個片元通過了所有的測試,就需要把這個片元的顏色值和已經(jīng)存儲在顏色緩沖區(qū)中的顏色進(jìn)行合并

    至此,整個GPU渲染管線就結(jié)束了。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI