建立一個自己的視窗
首先,引入標頭檔案,如下圖所示:
#define GLEW_STATIC #include<iostream>GLE #include<GL/glew.h> #include<GLFW/glfw3.h>
定義GLEW_STATIC巨集是因為我們需要使用GLEW靜態的連結庫。iostream標頭檔案是用於輸出。
這裡要確保GLEW的標頭檔案要寫在GLFW之前,在glew.h的標頭檔案中會引入許多OpenGL所必要的標頭檔案,所以你需要在包含其它依賴於OpenGL的標頭檔案之前先包含GLEW標頭檔案。
接下來建立main函式來例項化GLFW:
int main() { glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
}
首先,我們使用gifwInit()方法來初始化GLFW,接下來我們使用glfwWindowHinit()方法來配置GLFW,在這裡我們設定OpenGl的主版本號為3,次版本號也為3,即使用3.3版本的OpegGL。同時告訴GLFW我們使用的是核心模式(CORE_PROFILE)。
然後我們來建立一個視窗物件:
GLFWwindow *window = glfwCreateWindow(800, 600, "My OpenGL Window", NULL, NULL); if (window == NULL) { printf("Open Window Filed!"); glfwTerminate(); return -1; } glfwMakeContextCurrent(window);
glfwCreatWindow函式的前兩個引數分別表示視窗的寬和高,第三個引數為視窗的名字,後兩個引數我們暫時忽略掉,賦值為NULL即可。這個方法會返回一個GLFWwindow的物件,我們將它儲存在指標window中,它將會被其它GLFW函式所呼叫。接下來進行安全校驗,如果返回的值為空時,表示開啟視窗失敗,使用glfwTerminate()方法停止視窗的繪製並回收資源。如果返回值不為空,則通知GLFW將我們視窗的上下文設定為當前執行緒的主上下文。
Viewport(視口)
在開始渲染之前,我們需要設定需要繪製的視窗的大小,這樣OpemGL才知道怎麼相對於視窗大小顯示資料和座標。在這裡我們可以使用glViewport來設定視窗的維度:
glViewport(0, 0, 800, 600);
前兩個引數表示我們繪製的視窗的左下角的位置,第三個第四個引數設定我們要渲染的視窗的寬和高(單位為畫素),數值要和我們之前設定的GLFW的視窗的寬和高相同。
事實上,OpenGL通過glViewport中定義的座標和寬高進行轉換,將OpenGL中的位置座標轉換為我們的螢幕座標。其中處理過的OpenGL座標範圍為(-1,1),例子中我們就是將(-1,1)範圍內的座標對映到(0,800)和(0,600)
我們當然想看到我們繪製的視窗,並讓我們的視窗接受使用者的輸入,渲染圖片什麼的,而不是讓它一閃而過。這裡我們可以使用一個while迴圈來實現:
while (!glfwWindowShouldClose(window)) { glfwSwapBuffers(window); glfwPollEvents(); }
glfwWindowShouleClose()可以在每次迴圈時判斷當前視窗是否被關閉,如果被關閉則退出迴圈,如果沒有被關閉,則使用glfwSwapBuffers()交換色彩緩衝區(在GLFW中包含每個畫素的值的緩衝區),在迴圈沒有退出時,它將會持續渲染並顯示在自己的螢幕上。glfwPollEvents方法監聽事件並作出相應的迴應(比如鍵盤的輸入和滑鼠的拖動)。
關於雙緩衝:OplenGL的渲染是從上到下,從左到右。而雙緩衝則包括了一個前緩衝和後緩衝,前緩衝只負責將渲染的圖片顯示到螢幕上,後緩衝則負責呼叫渲染的命令,當後緩衝中的命令執行完畢之後,前緩衝和後緩衝交換位置,這樣做能夠讓圖片立刻展示在使用者面前。
在結束程式之前,我們需要回收所有GLFW所呼叫的資源。程式碼如下:
glfwTerminate(); return 0;
然後執行程式,我們就可以得到我們自己的視窗: