1. 程式人生 > >使用glew和glad 新建窗口

使用glew和glad 新建窗口

while ret 新建 依賴 更新窗口 改變 while循環 ear 鍵盤

一、添加頭文件

首先,將頭文件加到項目的.cpp文件中

1 #include <glad/glad.h>
2 #include <GLFW/glfw3.h>

註:

包含glad的頭文件一定要在包含glfw的頭文件之前使用。因為glad的頭文件包含了正確的openGL頭文件(例如GL/gl.h),所以需要在需要依賴於openGL的頭文件之前使用glad.

二、創建main函數

在main函數中實例化GLFW窗口

int main() {
glfwInit();//調用glfwInit函數來初始化GLFW

// 配置GLFW--告訴GLFW使用OpenGL版本為3.3
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);//主版本號
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3);//次版本號
glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);//告訴GLFW使用的是核心模式(CORE_PROFILE)
return 0;
}

使用glfwWindowHint函數來配置GLFW。

glfwWindowHint函數的第一個參數代表選項的名稱,第二個參數接受一個整形,用來設置這個選項的值。

三、創建窗口對象

這個窗口對象存放了所有和窗口相關的數據,而且會被GLFW的其他函數頻繁的用到。

1 GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
2 if (window == NULL) {
3     cout << "Failed to creat GLFW window" << endl;
4     glfwTerminate();
5 return -1; 6 } 7 glfwMakeContextCurrent(window);

glfwCreateWindow函數需要窗口的寬和高作為它的前兩個參數。第三個參數表示這個窗口的名稱。這個函數將會返回一個GLFWwindow對象,我們會在其它的GLFW操作中使用到。創建完窗口我們就可以通知GLFW將我們窗口的上下文設置為當前線程的主上下文了。

四、初始化GLAD

GLAD用來管理OpenGL函數的指針,所以在調用任何OpenGL的函數之前我們需要初始化GLAD。

1 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
2 cout << "Failed to initialize GLAD" << endl; 3 return -1; 4 }

我們給GLAD傳入了用來加載系統相關的OpenGL函數指針地址的函數。GLFW給我們的是glfwGetProcAddress

五、視口

在開始渲染圖形之前我們需要告訴OpenGL渲染窗口的尺寸大小,即視口(viewport),這樣OpenGL才知道怎樣根據窗口大小顯示數據和坐標。

glViewPort()將標準化坐標系轉換到屏幕坐標系

當窗口大小改變時,視口也被調整。可以對窗口註冊一個回調函數(callback function),它會在每次窗口大小被調整的時候被調用。這個回調函數的原型為:

幀緩沖大小函數

void frambuffer_size_callback(GLFWwindow* window,int width,int height)

每當窗口改變大小,GLFW會調用這個函數並填充相應的參數供你處理。

void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
    glViewport(0,0,width,height);
}

我們還需要註冊這個函數,告訴GLFW我們希望每當窗口調整大小的的時候調用這個函數:

glfwSetFramebufferSizeCallback(window,framebuffer_size_callback)

雖然是當窗口大小改變的時候調用這個函數,但是在第一次顯示窗口的時候也會調用這個函數。

六、準備好引擎

我們不希望只繪制一個圖像之後我們的應用程序就立即退出並關閉窗口。我們希望程序在我們主動關閉之前不斷繪制圖像並能夠接受用戶輸入。因此,我們需要在程序中添加一個while循環,我們可以稱之為渲染循環(render loop),它能在我們讓glfw退出前一直保持運行。

下邊是一個簡單的渲染循環:

1 while(!glfwWindowShouldClose(window))
2 {
3     glfwSwapBuffers(window);
4     glfwPollEvents();    
5 }

glfwWindowShouldClose:函數在我們每次循環的開始前檢查一次GLFW是否被要求退出,如果是,該函數返回true然後渲染循環便結束了。

glfwPollEvents函數檢查有沒有出發什麽事件(比如鍵盤輸入、鼠標移動等)、更新窗口狀態、並調用對應的回調函數。

glfwSwapBuffers函數交換顏色緩沖。

使用glew和glad 新建窗口