OpenGL渲染管線和着色器詳解(重點和難點)

OpenGL的渲染管線和着色器是很是重要的概念,須要緊緊掌握,才能繼續學習後面內容。git

頂點數組對象:Vertex Array Object,VAO
頂點緩衝對象:Vertex Buffer Object,VBO
索引緩衝對象:Element Buffer Object,EBO或Index Buffer Object,IBO

1.渲染管線

在OpenGL中,任何事物都在3D空間中,而屏幕和窗口倒是2D像素數組,這致使OpenGL的大部分工做都是關於把3D座標轉變爲適應你屏幕的2D像素。3D座標轉爲2D座標的處理過程是由OpenGL的圖形渲染管線(Graphics Pipeline,大多譯爲管線,實際上指的是一堆原始圖形數據途經一個輸送管道,期間通過各類變化處理最終出如今屏幕的過程)管理的。圖形渲染管線接受一組3D座標,而後把它們轉變爲你屏幕上的有色2D像素輸出。圖形渲染管線能夠被劃分爲兩個主要部分:第一部分把你的3D座標轉換爲2D座標,第二部分是把2D座標轉變爲實際的有顏色的像素。github

2D座標和像素也是不一樣的,2D座標精確表示一個點在2D空間中的位置,而2D像素是這個點的近似值,2D像素受到你的屏幕/窗口分辨率的限制。小程序

2.着色器

在GPU上爲每個(渲染管線)階段運行各自的小程序,從而在圖形渲染管線中快速處理你的數據。這些小程序叫作着色器(Shader)。OpenGL着色器是用OpenGL着色器語言(OpenGL Shading Language, GLSL)寫成的。下圖中藍色部分表明的是咱們能夠注入自定義的着色器的部分。數組

OpenGL渲染管線和着色器詳解(重點和難點)

首先,咱們以數組的形式傳遞3個3D座標做爲圖形渲染管線的輸入,用來表示一個三角形,這個數組叫作頂點數據(Vertex Data);頂點數據是一系列頂點的集合。一個頂點(Vertex)是一個3D座標的數據的集合。而頂點數據是用頂點屬性(Vertex Attribute)表示的,它能夠包含任何咱們想用的數據,可是簡單起見,咱們仍是假定每一個頂點只由一個3D位置(譯註1)和一些顏色值組成的吧。ide

爲了讓OpenGL知道咱們的座標和顏色值構成的究竟是什麼,OpenGL須要你去指定這些數據所表示的渲染類型。咱們是但願把這些數據渲染成一系列的點?一系列的三角形?仍是僅僅是一個長長的線?作出的這些提示叫作圖元(Primitive),任何一個繪製指令的調用都將把圖元傳遞給OpenGL。這是其中的幾個:GL_POINTS、GL_TRIANGLES、GL_LINE_STRIP。學習

(1)頂點着色器(Vertex Shader):圖形渲染管線的第一個部分是頂點着色器(Vertex Shader),它把一個單獨的頂點做爲輸入。頂點着色器主要的目的是把3D座標轉爲另外一種3D座標(後面會解釋),同時頂點着色器容許咱們對頂點屬性進行一些基本處理。測試

(2)圖元裝配(Primitive Assembly):圖元裝配(Primitive Assembly)階段將頂點着色器輸出的全部頂點做爲輸入(若是是GL_POINTS,那麼就是一個頂點),並全部的點裝配成指定圖元的形狀;本節例子中是一個三角形。spa

(3)幾何着色器(Geometry Shader):圖元裝配階段的輸出會傳遞給幾何着色器(Geometry Shader)。幾何着色器把圖元形式的一系列頂點的集合做爲輸入,它能夠經過產生新頂點構造出新的(或是其它的)圖元來生成其餘形狀。例子中,它生成了另外一個三角形。code

(4)光柵化(Rasterization ):幾何着色器的輸出會被傳入光柵化階段(Rasterization Stage),這裏它會把圖元映射爲最終屏幕上相應的像素,生成供片斷着色器(Fragment Shader)使用的片斷(Fragment)。在片斷着色器運行以前會執行裁切(Clipping)。裁切會丟棄超出你的視圖之外的全部像素,用來提高執行效率。對象

(5)片斷着色器(Fragment Shader):片斷着色器的主要目的是計算一個像素的最終顏色,這也是全部OpenGL高級效果產生的地方。一般,片斷着色器包含3D場景的數據(好比光照、陰影、光的顏色等等),這些數據能夠被用來計算最終像素的顏色。OpenGL中的一個片斷是OpenGL渲染一個像素所需的全部數據。

(6)Alpha測試和混合(Blending):在全部對應顏色值肯定之後,最終的對象將會被傳到最後一個階段,咱們叫作Alpha測試和混合(Blending)階段。這個階段檢測片斷的對應的深度(和模板(Stencil))值,用它們來判斷這個像素是其它物體的前面仍是後面,決定是否應該丟棄。這個階段也會檢查alpha值(alpha值定義了一個物體的透明度)並對物體進行混合(Blend)。因此,即便在片斷着色器中計算出來了一個像素輸出的顏色,在渲染多個三角形的時候最後的像素顏色也可能徹底不一樣。

對於大多數場合,咱們只須要配置頂點和片斷着色器就好了。幾何着色器是可選的,一般使用它默認的着色器就好了。在現代OpenGL中,咱們必須定義至少一個頂點着色器和一個片斷着色器(由於GPU中沒有默認的頂點/片斷着色器)。出於這個緣由,剛開始學習現代OpenGL的時候可能會很是困難,由於在你可以渲染本身的第一個三角形以前已經須要瞭解一大堆知識了。

參考:
https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/

相關文章
相關標籤/搜索