天天看點

opengl 簡介OpenGL到底是什麼?狀态機基元類型(Primitive Type)OpenGL工作流opengl 圖形渲染管線

opengl 學習筆記,轉自:LearnOpenGL

OpenGL到底是什麼?

OpenGL本身并不是一個API,它僅僅是一個由Khronos組織制定并維護的規範(Specification)。OpenGL庫的開發者通常是顯示卡的生産商,故當

産生一個bug時通常可以通過更新顯示卡驅動來解決。這些驅動會包括你的顯示卡能支援的最新版本的OpenGL。

狀态機

OpenGL自身是一個巨大的狀态機(State Machine)。OpenGL的狀态通常被稱為OpenGL上下文(Context)。我們使用目前OpenGL上下文來渲

染。假設當我們想告訴OpenGL去畫線段而不是三角形的時候,我們通過改變一些上下文變量來改變OpenGL狀态,進而告訴OpenGL如何去繪

圖。一旦我們改變了OpenGL的狀态為繪制線段,下一個繪制指令就會畫出線段而不是三角形。

基元類型(Primitive Type)

使用OpenGL時,建議使用OpenGL定義的基元類型。比如使用

float

時我們加上字首

GL

(是以寫作

GLfloat

)。

int

uint

char

bool

等等也類似。OpenGL定義的這些GL基元類型的記憶體布局是與平台無關的,而int等基元類型在不同作業系統上可能有不同的記憶體布局。使用GL基元類型可以保證你的程式在不同的平台上工作一緻。

OpenGL工作流

// 建立對象
GLuint objectId = 0;
glGenObject(1, &objectId);
// 綁定對象至上下文
glBindObject(GL_WINDOW_TARGET, objectId);
// 設定目前綁定到 GL_WINDOW_TARGET 的對象的一些選項
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 将上下文對象設回預設
glBindObject(GL_WINDOW_TARGET, 0);
           

首先建立一個對象,然後用一個id儲存它的引用(實際資料被儲存在背景)。然後我們将對象綁定至上下文的目标位置(例子中視窗對象目

标的位置被定義成GL_WINDOW_TARGET)。接下來我們設定視窗的選項。最後我們将目标位置的對象id設回0,解綁這個對象。設定的選項

将被儲存在objectId所引用的對象中,一旦我們重新綁定這個對象到GL_WINDOW_TARGET位置,這些選項就會重新生效。

opengl 圖形渲染管線

Graphics Pipeline,指的是一堆原始圖形資料途經一個輸送管道,期間經過各種變化處理最終出現在螢幕的過程。

opengl 簡介OpenGL到底是什麼?狀态機基元類型(Primitive Type)OpenGL工作流opengl 圖形渲染管線

藍色部分代表的是我們可以注入自定義的着色器的部分。

首先,我們以數組的形式傳遞3個3D坐标作為圖形渲染管線的輸入,用來表示一個三角形,這個數組叫做頂點資料(Vertex Data)。一個頂點

(Vertex)是一個3D坐标的資料的集合。而頂點資料是用頂點屬性(Vertex Attribute)表示的,簡單起見,假定每個頂點隻由一個3D位置和一些顔

色值組成的吧。

第一個部分是頂點着色器(Vertex Shader),它把一個單獨的頂點作為輸入。頂點着色器主要的目的是把3D坐标轉為另一種3D坐标 ,同時頂點

着色器允許我們對頂點屬性進行一些基本處理。

圖元裝配(Primitive Assembly)階段将頂點着色器輸出的所有頂點作為輸入(如果是GL_POINTS,那麼就是一個頂點),并把所有的點裝配成

指定圖元的形狀(比如三角形)。

圖元裝配階段的輸出會傳遞給幾何着色器(Geometry Shader)。幾何着色器把圖元形式的一系列頂點的集合作為輸入,它可以通過産生新頂點

構造出新的(或是其它的)圖元來生成其他形狀。

幾何着色器的輸出會被傳入光栅化階段(Rasterization Stage),這裡它會把圖元映射為最終螢幕上相應的像素,生成供片段着色器(Fragment

 Shader)使用的片段(Fragment)。在片段着色器運作之前會執行裁切(Clipping)。裁切會丢棄超出你的視圖以外的所有像素,用來提升執行效

率。片段是OpenGL渲染一個像素所需的所有資料。

片段着色器的主要目的是計算一個像素的最終顔色,這也是所有OpenGL進階效果産生的地方。通常,片段着色器包含3D場景的資料(比如

光照、陰影、光的顔色等等),這些資料可以被用來計算最終像素的顔色。

在所有對應顔色值确定以後,最終的對象将會被傳到最後一個階段,我們叫做Alpha測試和混合(Blending)階段。這個階段檢測片段的對應的

深度(和模闆(Stencil))值,用它們來判斷這個像素是其它物體的前面還是後面,決定是否應該丢棄。這個階段也會檢查alpha值(alpha值定

義了一個物體的透明度)并對物體進行混合(Blend)。是以,即使在片段着色器中計算出來了一個像素輸出的顔色,在渲染多個三角形的時候

最後的像素顔色也可能完全不同。

繼續閱讀