OpenGL渲染流水線

什么是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作為透視距離的依據,滿足透視需要。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 渲染流水線的最終目的在于生成或者說是渲染一張二維紋理,即我們在電腦屏幕上看到的所有效果。它的輸入是一個虛擬攝像機、...
    挖打發(fā)閱讀 443評論 0 0
  • 本文同時發(fā)布在我的個人博客上:https://dragon_boy.gitee.io[https://dragon...
    Dragon_boy閱讀 759評論 2 1
  • 本文實際上是《Unity Shader入門精要》一書的讀書筆記,書中關于渲染流水線的講解清楚易懂,非常適合作為Sh...
    iwiniwin閱讀 888評論 0 3
  • Unity Shader學習-1.渲染流水線 先了解一下什么是流水線:(下面是百度百科的定義) 流水線:流水線又稱...
    ZeroTryTryTry閱讀 5,594評論 2 17
  • 1.1綜述 渲染流水線的最終目的在于生成或者說是渲染一張二維紋理,即我們在電腦屏幕上看到的所有效果。它的輸入是一個...
    DD_9766閱讀 388評論 0 1

友情鏈接更多精彩內容