OpenGL學習總結(一)
OpenGL基礎
一、OpenGL是一個狀態機
OpenGL本身是一個巨大的狀態機,所以程式設計的根本目的使用一些列操作和變數來改變OpenGL的工作狀態,例如:要繪製一個三角形的時候,我們先要告訴它接下來將要繪製三角形,使其切換狀態,然後再將要繪製的三角形的座標告訴它,隨後才可以繪製三角形。再比如:要對視訊記憶體進行操作,我們要先繫結需要操作的視訊記憶體,然後接下來的操作就都會預設為是對已繫結視訊記憶體的操作,當我們操作完畢後就需要解綁,使其恢復到原來的工作狀態。
二、搭建OpenGL工作環境
1、GLFW
GLFW是一個專門針對OpenGL的C語言庫,它提供了一些渲染物體所需的最低限度的介面。它允許使用者建立OpenGL上下文,定義視窗引數以及處理使用者輸入。
首先:
然後:我們需要用到CMake來把下載好的原始碼生成為工程檔案。
最後:執行工程檔案能夠得到glfw的.lib檔案,將其放在E:\VS2015\VC\lib中即可。然後將原始碼包中include資料夾下的標頭檔案放在E:\VS2015\VC\include即可。
使用:在VS中右鍵專案找到屬性然後是連結器->輸入->附加依賴項將glfw3.lib新增進去。程式設計時新增:
#include <GLFW\glfw3.h>
2、GLEW
OpenGL只是一個標準/規範,具體的實現是由驅動開發商針對特定顯示卡實現的。由於OpenGL驅動版本眾多,它大多數函式的位置都無法在編譯時確定下來,需要在執行時查詢。任務就落在了開發者身上,開發者需要在執行時獲取函式地址並將其儲存在一個函式指標中供以後使用。GLEW是OpenGL Extension Wrangler Library的縮寫,它能解決我們上面提到的那個繁瑣的問題。
GLEW的搭建與使用方法同GLFW,最後的附加依賴項為glew32s.lib。程式設計時新增:
#define GLEW_STATIC
#include <GL/glew.h>
3、SOIL
SOIL是簡易OpenGL影象庫(Simple OpenGL Image Library)的縮寫,它支援大多數流行的影象格式,使用起來也很簡單,你可以從他們的主頁:http://www.lonesock.net/soil.html下載。像其它庫一樣,你必須自己生成.lib。
附加依賴項為SOIL.lib。程式設計時新增:
#include <SOIL.h>
4、Assimp
Assimp,全稱為Open Asset Import Library。Assimp可以匯入幾十種不同格式的模型檔案(同樣也可以匯出部分模型格式)。只要Assimp載入完了模型檔案,我們就可以從Assimp上獲取所有我們需要的模型資料。Assimp把不同的模型檔案都轉換為一個統一的資料結構,所有無論我們匯入何種格式的模型檔案,都可以用同一個方式去訪問我們需要的模型資料。
下載網址:
Assimp的搭建方式同上述三個庫,需要注意的是它不僅僅有一個.lib檔案還有一個.dll檔案,.dll檔案我們需要把它放在你執行程式時產生的.exe檔案的目錄當中。
三、常見的OpenGL基本概念
1、頂點緩衝物件VBO:一個呼叫視訊記憶體並存儲所有頂點資料供顯示卡使用的緩衝物件。
VBO歸根到底是顯示卡儲存空間裡的一塊快取區(Buffer)而已,這個Buffer有它的名字(VBO的ID),OpenGL在GPU的某處記錄著這個ID和對應的視訊記憶體地址(或者地址偏移,類似記憶體)。
2、頂點陣列物件VAO:儲存緩衝區和頂點屬性狀態。用一張圖來解釋一下:
引用知乎某回答來形象的解釋一下:
OpenGL在畫畫的時候,要用到很多的資訊,如頂點的座標、紋理、顏色等等…. 假如一個頂點包含了座標和顏色的資訊,那麼這個頂點處的資料格式可能如下:
x, y, z, r, g, b
這些值會被儲存在一個叫VBO (vertex buffer object)的地方。
因而,可以把VBO理解成一個數據區域,這裡面存放了渲染所需要的一切資訊。但需要注意的是,資料在VBO裡面的時候,OpenGL是並不知道這裡面的每個資料所代表的具體含義的,只是一堆數值罷了。
這時候,VAO(vertex array object)就派上用場了。
VAO指定了讀取VBO的方式~~
假如VBO裡面現在存放了如下的內容:
x0, y0, z0, r0, g0, b0
x1, y1, z1, r1, g1, b1
x2, y2, z2, r2, g2, b2
VAO可以定義一種格式說,我每次只取VBO裡面的x,y,z的值;也可以定義一種格式說,每次只取VBO裡面的r,g,b的值。這樣我們就可以在渲染的時候,繫結不同的VAO,實現按照不同的格式將VBO裡面的東西渲染出來~
3、EBO索引緩衝物件
EBO和VBO一樣,也是儲存於視訊記憶體中的資料,它的作用主要是告訴OpenGL如何繪製頂點,比如我們現在有9個頂點,若EBO中儲存的資料是0,5,3,4,6,7則繪製的時候會按照上述順序來繪製圖形。