使用glew和glad 新建窗口
一、添加頭文件
首先,將頭文件加到項(xiàng)目的.cpp文件中
1 #include <glad/glad.h> 2 #include <GLFW/glfw3.h>注:
包含glad的頭文件一定要在包含glfw的頭文件之前使用。因?yàn)間lad的頭文件包含了正確的openGL頭文件(例如GL/gl.h),所以需要在需要依賴于openGL的頭文件之前使用glad.
二、創(chuàng)建main函數(shù)
在main函數(shù)中實(shí)例化GLFW窗口
int main() {
glfwInit();//調(diào)用glfwInit函數(shù)來初始化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函數(shù)來配置GLFW。
glfwWindowHint函數(shù)的第一個(gè)參數(shù)代表選項(xiàng)的名稱,第二個(gè)參數(shù)接受一個(gè)整形,用來設(shè)置這個(gè)選項(xiàng)的值。
三、創(chuàng)建窗口對象
這個(gè)窗口對象存放了所有和窗口相關(guān)的數(shù)據(jù),而且會被GLFW的其他函數(shù)頻繁的用到。
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函數(shù)需要窗口的寬和高作為它的前兩個(gè)參數(shù)。第三個(gè)參數(shù)表示這個(gè)窗口的名稱。這個(gè)函數(shù)將會返回一個(gè)GLFWwindow對象,我們會在其它的GLFW操作中使用到。創(chuàng)建完窗口我們就可以通知GLFW將我們窗口的上下文設(shè)置為當(dāng)前線程的主上下文了。
四、初始化GLAD
GLAD用來管理OpenGL函數(shù)的指針,所以在調(diào)用任何OpenGL的函數(shù)之前我們需要初始化GLAD。
1 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { 2 cout << "Failed to initialize GLAD" << endl; 3 return -1; 4 }我們給GLAD傳入了用來加載系統(tǒng)相關(guān)的OpenGL函數(shù)指針地址的函數(shù)。GLFW給我們的是glfwGetProcAddress
五、視口
在開始渲染圖形之前我們需要告訴OpenGL渲染窗口的尺寸大小,即視口(viewport),這樣OpenGL才知道怎樣根據(jù)窗口大小顯示數(shù)據(jù)和坐標(biāo)。
glViewPort()將標(biāo)準(zhǔn)化坐標(biāo)系轉(zhuǎn)換到屏幕坐標(biāo)系
當(dāng)窗口大小改變時(shí),視口也被調(diào)整。可以對窗口注冊一個(gè)回調(diào)函數(shù)(callback function),它會在每次窗口大小被調(diào)整的時(shí)候被調(diào)用。這個(gè)回調(diào)函數(shù)的原型為:
幀緩沖大小函數(shù)
void frambuffer_size_callback(GLFWwindow* window,int width,int height)每當(dāng)窗口改變大小,GLFW會調(diào)用這個(gè)函數(shù)并填充相應(yīng)的參數(shù)供你處理。
void framebuffer_size_callback(GLFWwindow* window, int width, int height) {glViewport(0,0,width,height); }我們還需要注冊這個(gè)函數(shù),告訴GLFW我們希望每當(dāng)窗口調(diào)整大小的的時(shí)候調(diào)用這個(gè)函數(shù):
glfwSetFramebufferSizeCallback(window,framebuffer_size_callback)雖然是當(dāng)窗口大小改變的時(shí)候調(diào)用這個(gè)函數(shù),但是在第一次顯示窗口的時(shí)候也會調(diào)用這個(gè)函數(shù)。
六、準(zhǔn)備好引擎
我們不希望只繪制一個(gè)圖像之后我們的應(yīng)用程序就立即退出并關(guān)閉窗口。我們希望程序在我們主動關(guān)閉之前不斷繪制圖像并能夠接受用戶輸入。因此,我們需要在程序中添加一個(gè)while循環(huán),我們可以稱之為渲染循環(huán)(render loop),它能在我們讓glfw退出前一直保持運(yùn)行。
下邊是一個(gè)簡單的渲染循環(huán):
1 while(!glfwWindowShouldClose(window)) 2 { 3 glfwSwapBuffers(window); 4 glfwPollEvents(); 5 }glfwWindowShouldClose:函數(shù)在我們每次循環(huán)的開始前檢查一次GLFW是否被要求退出,如果是,該函數(shù)返回true然后渲染循環(huán)便結(jié)束了。
glfwPollEvents函數(shù)檢查有沒有出發(fā)什么事件(比如鍵盤輸入、鼠標(biāo)移動等)、更新窗口狀態(tài)、并調(diào)用對應(yīng)的回調(diào)函數(shù)。
glfwSwapBuffers函數(shù)交換顏色緩沖。
七、輸入
在GLFW中實(shí)現(xiàn)一些輸入控制,可以通過幾個(gè)輸入函數(shù)完成。
glfwGetKey函數(shù)需要一個(gè)窗口及一個(gè)按鍵作為輸入,這個(gè)函數(shù)將會返回這個(gè)按鍵是否正在被按下。我們可以創(chuàng)建一個(gè)processInput函數(shù),在其內(nèi)放置不同的輸入函數(shù),讓輸入代碼保持整潔。
1 void processInput(GLFWwindow *window) { 2 if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) { 3 glfwSetWindowShouldClose(window,true); 4 } 5 }這里我們檢查用戶是否按下了返回鍵(Esc)(如果沒有按下,glfwGetKey將會返回GLFW_RELEASE。如果用戶的確按下了返回鍵,我們將通過glfwSetwindowShouldClose使用把WindowShouldClose屬性設(shè)置為?true的方法關(guān)閉GLFW。下一次while循環(huán)的條件檢測將會失敗,程序?qū)P(guān)閉。
并添加到while循環(huán)中的第一個(gè)語句。
八、釋放資源
當(dāng)渲染循環(huán)結(jié)束后我們需要正確釋放/刪除之前分配的所有資源。可以在main函數(shù)的最后調(diào)用glfwTerminate()來完成。
1 glfwTerminate(); 2 return 0;這樣便能清理所有的資源并正確的退出應(yīng)用程序。
代碼:NEW.cpp
轉(zhuǎn)載于:https://www.cnblogs.com/keguniang/p/9897420.html
總結(jié)
以上是生活随笔為你收集整理的使用glew和glad 新建窗口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新中新电子f200a驱动安装_【电子税务
- 下一篇: webview 防止js注入_天台县js