一張圖帶你了解計算機(jī)圖形渲染管線!再也不怕面試問到圖形渲染管線!

圖形學(xué)是我認(rèn)為客戶端的最重要的兩個知識之一。因為你能看到的所有畫面都是圖形學(xué)渲染而來。另一個重要的知識是射線。
下面是各個階段的詳細(xì)介紹(文中圖片來自實時渲染第4版截圖):

應(yīng)用階段:
有關(guān)術(shù)語:圖元:構(gòu)成模型的基本單元,點、線、三角形。圖元的基本單元是頂點。
本階段主要是將與渲染有關(guān)的場景數(shù)據(jù)包括:模型圖元數(shù)據(jù)、光源數(shù)據(jù)、攝像機(jī)數(shù)據(jù)傳遞到幾何階段。這個階段是在CPU中進(jìn)行的,因此可以由程序員全權(quán)控制,比如應(yīng)用一些算法對渲染性能做一些優(yōu)化。
幾何階段:
主要是將模型的頂點數(shù)據(jù)包括位置信息和著色信息轉(zhuǎn)換到屏幕空間。此后的階段都是位于GPU中,一部分是可由程序員編程的,一部分是高度可配置的,還有一部分是設(shè)備自身決定。
頂點著色:
任務(wù)有兩個:
1、通過坐標(biāo)轉(zhuǎn)換將模型的頂點位置數(shù)據(jù)轉(zhuǎn)換到視圖空間。
首先頂點著色階段拿到的頂點坐標(biāo)數(shù)據(jù)都是位于模型空間的,要經(jīng)過模型轉(zhuǎn)換將這些坐標(biāo)數(shù)據(jù)轉(zhuǎn)換到世界空間。接著為了方便后面的投影和裁剪,需要將坐標(biāo)數(shù)據(jù)從世界空間轉(zhuǎn)換到攝像機(jī)空間(攝像機(jī)位置為原點,x軸指向右方,y指向上方,z軸是背離攝像機(jī)朝向的方向),這稱為視圖轉(zhuǎn)換。模型轉(zhuǎn)換和視圖轉(zhuǎn)換都可以用4x4的矩陣進(jìn)行操作。

2、計算頂點著色數(shù)據(jù)。
應(yīng)用材質(zhì),燈光等數(shù)據(jù)計算出頂點的著色數(shù)據(jù),并儲存在頂點中。當(dāng)然這里也可以不用計算任何著色數(shù)據(jù),把著色信息存儲在頂點中,傳遞后后續(xù)階段進(jìn)行處理。
這一階段是可由程序員編程的,稱為頂點著色器。程序員可以自由決定頂點著色的方程式,也可以不處理,只是將著色數(shù)據(jù)傳遞到下面階段。并且,程序員可以在位置變換上做手腳,使模型的位置信息靈活多變,產(chǎn)生一些獨特的效果,甚至可以做動畫(頂點動畫)。
投影:
使用最多的兩種投影方式是:透視投影和正交投影。為了方便裁剪,無論采用哪種投影方式,攝像機(jī)空間的數(shù)據(jù)最終會統(tǒng)一轉(zhuǎn)換到單元立方體呢。這個過程稱為投影轉(zhuǎn)換,最終物體處于裁剪空間也叫齊次空間。
裁剪:
只有攝像機(jī)視錐體內(nèi)的物體才是可見的。視錐體已經(jīng)轉(zhuǎn)換成了單元立方體,因此只有位于單元立方體內(nèi)部的圖元才會保留,位于外部的會被舍棄,相交的圖元會被裁剪。

屏幕映射:
將上述保留下來的圖元映射到屏幕上。這個過程基本上是一個縮放的過程,將單元立方體中的圖元,根據(jù)屏幕大小,得到圖元的屏幕坐標(biāo),注意屏幕坐標(biāo)是二維的,屏幕坐標(biāo)和z軸構(gòu)成了窗口坐標(biāo)系,xy軸儲存著屏幕的位置,z軸儲存著深度值,深度值主要是表示物體的遮擋關(guān)系。

光柵化:
有關(guān)術(shù)語:片元:獨立的一塊片段數(shù)據(jù),儲存著著色信息和深度值。會與屏幕的像素進(jìn)行比較,最后影響屏幕上的像素顏色。
顏色緩沖區(qū):一塊內(nèi)存,存儲著屏幕上每塊像素的顏色。
深度緩沖區(qū):一塊內(nèi)存,存儲著屏幕上每塊像素的深度。
主要是將屏幕上的頂點數(shù)據(jù)轉(zhuǎn)換成像素數(shù)據(jù)。
三角形設(shè)置:
每三個頂點形成一個三角形。為了后續(xù)階段的計算,會根據(jù)頂點的信息以及一些方程計算出三角形邊界的信息。
三角形遍歷:
遍歷所有的三角形,根據(jù)上述邊界信息,計算其覆蓋的像素,并且會生成一個片元。片元中保存著著色信息,以及深度信息。這些數(shù)據(jù)是通過三角形三個頂點數(shù)據(jù)的插值運算得到的。注意:片元并不是像素,像素是屏幕上顯示顏色的單元,片元只是保存了像素的數(shù)據(jù)。
像素處理階段
將片元與原有的像素合并輸出到屏幕上。
像素著色:
逐片元的操作,這里跟頂點著色一樣屬于可編程的,也稱為片元著色器(像素著色器)。這里主要作用跟頂點著色很像,計算著色信息,但是主角變了,頂點著色器主要作用于頂點,片元著色器主要作用于片元??梢赃\用各種計算方式,以及技術(shù),比如貼紋理(圖片),重新生成片元的顏色信息。
合并:
合并是指的,前一階段得到的片元與對應(yīng)的屏幕像素進(jìn)行合并。那么具體的合并是怎么操作的?主要的步驟有兩個:
1、測試。測試是決定哪些片元有資格與像素顏色合并,哪些片元需要被舍棄掉。
2、合并。將片元顏色與對應(yīng)的像素顏色合并。具體的合并方式是高度可配置的。我們可以決定直接替換掉原有顏色,也可以用一定的規(guī)則混合兩個顏色。
有一個算法叫z算法,也稱為深度測試。每塊像素的顏色儲存在顏色緩沖區(qū),深度值儲存在深度緩沖區(qū)。同時片元中保存著有新的顏色值和深度值,首先深度值會與屏幕上像素的深度值進(jìn)行比較,如果片元深度值小于屏幕上像素的深度值,那么就代表當(dāng)前片元是比屏幕上對應(yīng)的像素要離攝像機(jī)更近,此時就是把片元的顏色信息賦值給屏幕對應(yīng)像素的顏色緩沖區(qū),深度值賦值給屏幕對應(yīng)像素的深度緩沖區(qū);如果大于屏幕上像素的深度值,那么該片元就不會影響屏幕上的像素信息。這么做保證了渲染出來的畫面永遠(yuǎn)都是攝像機(jī)視角可見的元素,被遮擋的物體就被替換了。上述過程是無視渲染順序的。因此也就有了z算法的一個重大缺點就是處理透明度。
假設(shè)屏幕上已經(jīng)存在一個物體的渲染,接下來要渲染一個透明的物體,這個物體恰好位于已渲染的物體像素上,那么根據(jù)z算法要將當(dāng)前的透明物體的信息覆蓋到已有的物體信息。實際生活中,這種情況下,透明物體后面的物體還是可以看得到的,所以僅僅使用z算法不做處理的話,就會得到錯誤的視覺答案。
好在我們有其他的處理辦法。
Alpha通道與顏色緩沖區(qū)有緊密聯(lián)系。我們可以在片元著色器中決定棄除不想要的片元。可以用這種方式設(shè)置標(biāo)準(zhǔn)值,所有的片元的Alpha通道都會與該值比較,通過就可以參與后續(xù)操作,不通過就可以直接丟棄,不影響屏幕上原有的像素,這個過程稱為Alpha測試。
當(dāng)然還是會存在一定的問題,生活中完全透明的物體幾乎不存在,大多都是以半透明的形式存在,比如透過綠色玻璃可以看到后面的物體,首先綠色玻璃是我們可以看得到的,其次后面的物體顏色也會蒙上一層綠色。這里就涉及到合并階段顏色合并的一種方式,混合。不再是替換原來的像素的顏色,我們可以配置混合的方式,來決定合并階段最終像素的輸出顏色。
為了避免看到屏幕渲染的過程,屏幕渲染成像不是立即顯示在屏幕上的,而是采用了前后緩沖區(qū)。首先場景會渲染到后置緩沖區(qū),等渲染完畢,就翻轉(zhuǎn)到前置緩沖區(qū),這時候我們在屏幕上看到了完整的渲染畫面。
小結(jié):
知識點:能夠描述整個過程。關(guān)鍵詞已經(jīng)用加粗顯示了。這不僅僅是計算機(jī)圖形學(xué)的基礎(chǔ),也是游戲客戶端程序員要必須了解的一個點。很多公司面試都會問到這個問題。
參考資料:Real-Time-Rendering-4th