之前在學校學過一點點的OpenGL 2
(沒錯2020還在教OpenGL2
),而SFML
本身支援OpenGL
,所以打算趁這個機會學習一下比較新的OpenGL
,並且用在我的小遊戲上,所以接下來我會用幾天來講一點OpenGl
。
OpenGL定義了一套處理幾何(Geometric primitive)的元件,可以將其轉換成螢幕像素格式(Pixel)的流程。
OpenGL規範了每個function
該如何執行,以及他們的輸出直。但是每個function
的實作將由開發者自己決定,因為OpenGL
僅僅是一個規範
OpenGL
的開發者大多由顯卡場(Nvidia, AMD)撰寫,因此出Bug
的話通常要透過更新顯卡來解決問題。核心模式(Core-profile)與立即渲染模式(Immediate mode)
OpenGL 支援 擴展(Extension),透過擴展,開發者不必等新的OpenGL
規範就可以使用新的渲染特性了。通常若一個擴展非常流行或著有用的話,他就會成為新的規範了。
OpenGL 本質上是個狀態機(State Machine),OpenGL 的狀態叫做 上下文(Context)
一個常見的 OpenGL 程式碼可能長這樣
// 創建object
unsigned int objectId = 0;
glGenObject(1, &objectId);
// 綁定至context
glBindObject(GL_WINDOW_TARGET, objectId);
// 設定
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 解綁
glBindObject(GL_WINDOW_TARGET, 0);
目前只是一些大致上的描述,往後會有更多實際的例子
先在知道一些OpenGL
的相關知識了,明天我們會將OpenGL
用在SFML
這個框架裡。
不過在此之前還有東西要做。
我們知道OpenGL只是一個規範,實作都是由開發商根據特定顯卡實作。由於OpenGL的驅動版本眾多,大多的function
必須在run-time
的時候查詢。這樣開發者就需要在運行時獲取並保存funciton pointer
以便之後使用。取得的方法因平台而異。
Windows會大概像這樣
// function's prototype
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// find function and assign to a function pointer
GL_GENBUFFERS glGenBuffers = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// now can call
GLuint buffer;
glGenBuffers(1, &buffer);
感覺上複雜且繁瑣。但幸運的是有library
簡化此過程,有就是GLAD
GLAD使用的是Web Service
,在這裡我們告訴GLAD需要定義的OpenGL版本,並根據此版本加載相關的function
進到此頁面將設定完成之後按Generate,他會提供一個zip文件,解壓縮後我們就可以去include
他
#include <glad/glad.h>