什么是GPU渲染流水線
? ? ? ? 在OpenGL中,任何事物都在3D空間中,而屏幕和窗口卻是2D像素數(shù)組,這導致OpenGL大部分工作都是關于把3D坐標轉變?yōu)檫m應屏幕的2D像素。3D坐標轉為2D坐標的處理過程是由OpenGL的圖形渲染管線(Graphics Pipeline,大多譯為管線,指的是一堆原始圖形數(shù)據途經一個輸送管道,期間經過各種變化處理最終出現(xiàn)在屏幕的過程)管理的。圖形渲染管線可以被劃分為兩個主要部分:第一部分把你的3D坐標轉換為2D坐標(幾何階段);第二部分是把2D坐標轉變?yōu)閷嶋H的有顏色的像素(光柵化階段)。
渲染流程
? ? ? 渲染流水線是cpu和gpu配合渲染一幀的過程,其中渲染流程主要分為3個階段:應用階段,幾何階段, 光柵化階段。

CPU控制階段
? ? ? 應用階段屬于CPU控制階段
? ? ? ? ? ?1.準備場景數(shù)據,把數(shù)據加載到顯存中去。
? ? ? ? ? ?2.設置渲染狀態(tài),material,texture,shader等。
? ? ? ? ? ?3.調用DrawCall,輸出渲染圖元到gpu。
GPU控制階段
? ? ? ?GPU控制階段分為2個部分,幾何階段和光柵化階段,這兩個階段又可以細分成若干個更小的流水線階段,每個階段GPU提供了不同的可配置性和可編程性,具體如下圖所示:

一.幾何階段:
? ? ? 1.頂點著色器:頂點變換,逐頂點光照,輸出后續(xù)階段所需的數(shù)據。
? ? ? 2.圖元裝配:將頂點著色器輸出的所有頂點作為輸入(如果是GL_POINTS,那么就是一個頂點),并所有的點裝配成指定圖元的形狀。
? ? ? 3.幾何著色器(可選):產生新頂點構造出新的圖元來生成其他形狀。
? ? ? 4.裁剪:將不在攝像機視野內的頂點剔除掉,并剔除某些三角圖元的面片。
? ? ? 5.屏幕映射:將每個圖元的ndc坐標轉換到屏幕坐標系中。
二.光柵化階段:
? ? ?1.三角形設置:得到三角形邊界的表示方式,計算圖元覆蓋了哪些像素。
? ? ?2.三角形遍歷:判斷三角網格覆蓋了哪些像素,基于三角形頂點信息對整個覆蓋區(qū)域像素進行插值,輸出片元。
? ? ?3.片元著色器:紋理采樣,片元著色。
? ? ?4.逐片元操作:決定片元的可見性,深度測試,alpha,模板測試等,測試不通過的片元會被舍棄,測試通過的片元在開啟混合時會和像素緩沖區(qū)的顏色進行混合,最后將像素緩沖區(qū)中的顏色進行替換成該片元最終的顏色。
如下圖以一個三角形為例展示下渲染管線的每個階段,藍色部分代表的是我們可以自定義的著色器部分。

頂點變換
? ? ? ?不同坐標系之間的變換,一個渲染頂點,要想讓它呈現(xiàn)在屏幕上的某個位置,是需要讓這個頂點經過一個個坐標系的變換來進行的,每經過一個坐標系,它的坐標就會使用矩陣來執(zhí)行一次變換,最終變換到屏幕上的位置。Opengl頂點變換過程如下圖所示:

世界變換
? ? ? ? ?即我們所說的仿射變化,包括位移、旋轉、縮放。



相機變換
? ? ???以相機作為坐標原點的一個參考系,把物體從世界坐標系,變換到相機為原點的相機坐標系。
假設攝像機的位置為(Px,Py,Pz),以(θ,0,0)進行旋轉。
首先需要把相機平移到世界坐標原點,變換矩陣如下:

然后進行旋轉變換,變換矩陣如下:

透視變換
? ? ? ?經過前面兩輪變換,物體坐標已經變?yōu)橐韵鄼C為原點的坐標了,之后我們要進行投影變換(以透視投影為例)。

? ? ?透視變換矩陣為

透視除法
?????? 將齊次裁剪空間坐標轉為標準設備空間,實現(xiàn)比較簡單,用齊次坐標的w去除以x,y,? z分量,經過透視除法后剪裁空間會變換到一個立方體內,變換后的坐標x,y,z范圍在[-1,1].
視口變換
?????? 將標準設備空間坐標轉換到屏幕坐標,計算公式如下:
???? ? screenX = (1+Px)/2*screenWidth
???? ? screenY = (1+Py)/2*screenHeight
為什么使用齊次坐標
? ? ? 1.平移不是線性變換,3*3矩陣不能表示平移變換。
? ? ? 2.將平移,旋轉,縮放操作全部使用矩陣運算表示,統(tǒng)一格式,提高效率。
? ? ? 3. 以坐標中的W作為透視距離的依據,滿足透視需要。