簡單的opengl步驟模板

如下內容整理自:https://learnopengl-cn.github.io/01%20Getting%20started/03%20Hello%20Window/ios

一.初始化 glfw 並設置相關參數:git

 1 glfwInit();//使用glfw前必須用glgwInit函數來初始化glfw  2     //用glfwWindowHint函數來配置glfw  3     //咱們須要告訴GLFW咱們要使用的OpenGL版本是3.3  4     //將主版本號(Major)和次版本號(Minor)都設爲3
 5     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//選擇主版本號
 6     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//選擇次版本號  7     //咱們一樣明確告訴GLFW咱們使用的是核心模式(Core - profile)
 8  glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  9     //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 10     //若是使用的是Mac OS X系統則須要將註釋的這句加上才能使這些設置生效
View Code

 

二.經過 glfwCreateWindow 函數建立窗口:github

 1 //接下來咱們建立一個窗口對象,這個窗口對象存放了全部和窗口相關的數據,  2     //並且會被GLFW的其餘函數頻繁地用到
 3     GLFWwindow *window = glfwCreateWindow(800, 600, "LearnOpengl", NULL, NULL);  4     //建立窗口,前兩個參數爲窗口的寬和搞,第三個參數表示窗口的標題,後兩個參數暫時不討論
 5     if (window == NULL) {  6         std::cout << "failed to create glfw window" << std::endl;  7         glfwTerminate();//釋放以前分配的資源
 8         return -1;  9  } 10     //建立完窗口通知GLFW將窗口的上下文設置爲當前線程的主上下文
11     glfwMakeContextCurrent(window);
View Code

 

三.初始化 glad:ide

1 //GLAD是用來管理OpenGL的函數指針的,因此在調用任何OpenGL的函數以前 2     //咱們須要初始化GLAD 3     //咱們給GLAD傳入了用來加載系統相關的OpenGL函數指針地址的函數。GLFW給 4     //咱們的是glfwGetProcAddress,它根據咱們編譯的系統定義了正確的函數
5     if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { 6         std::cout << "failed to initialize glad" << std::endl; 7         return -1; 8     }
View Code

 

四.建立視口:函數

1 //視口 2     //在咱們開始渲染以前還有一件重要的事情要作,咱們必須告訴OpenGL渲染窗口的尺寸大小, 3     //即視口(Viewport),這樣OpenGL才只能知道怎樣根據窗口大小顯示數據和座標。 4     //咱們能夠經過調用glViewport函數來設置窗口的維度
5     glViewport(0, 0, 800, 600);//前兩個參數控制左下角的位置,後兩個參數控制渲染窗口的寬度和高度(像素) 6     //注意和前面的GLFWwindow區別開來,GLFWwindow定義的是GLFW的維度 7     //咱們實際上也能夠將視口的維度設置爲比GLFW的維度小,這樣子以後全部的OpenGL渲染將會在一個更小 8     //的窗口中顯示,這樣子的話咱們也能夠將一些其它元素顯示在OpenGL視口以外
View Code

注意區分建立 glfw 窗口和視口的區別spa

 

五.接下來在渲染循環以前咱們能夠註冊咱們須要的回掉函數:線程

1 //咱們還須要註冊回掉函數,告訴GLFW咱們但願每當窗口調整大小的時候調用這個函數
2  glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); 3     //當窗口被第一次顯示的時候framebuffer_size_callback也會被調用。對於視網膜(Retina)顯示屏,width和height都會明顯比原輸入值更高一點 4     //咱們還能夠將咱們的函數註冊到其它不少的回調函數中。好比說,咱們能夠建立一個回調函數來處理手柄輸入變化,處理錯誤消息等。咱們會在建立窗口以後, 5     //渲染循環初始化以前註冊這些回調函數
View Code

 

六.渲染循環:指針

 1 //渲染循環,讓glfw退出前一直保持運動  2     //glfwWindowShouldClose函數在咱們每次循環的開始前檢查一次GLFW是否被要求退出,若是是的話該函數返回true而後渲染循環便結束了,以後爲咱們就能夠關閉應用程序了
 3     while (!glfwWindowShouldClose(window)) {  4  processInput(window);  5 
 6         //清除顏色緩衝以後,整個顏色緩衝都會被填充爲glClearColor裏所設置的顏色
 7         glClearColor(1.0f, 0.0f, 0.0f, 1.0f);  8         //glClear函數清空屏幕的顏色緩衝
 9  glClear(GL_COLOR_BUFFER_BIT); 10 
11         //glfwSwapBuffers函數會交換顏色緩衝(它是一個儲存着GLFW窗口每個像素顏色值的大緩衝), 12         //它在這一迭代中被用來繪製,而且將會做爲輸出顯示在屏幕上。不然只會顯示一片空白
13  glfwSwapBuffers(window); 14         //glfwPollEvents函數檢查有沒有觸發什麼事件(好比鍵盤輸入、鼠標移動等)、更新窗口狀態,並調用對應的回調函數(能夠經過回調方法手動設置)
15  glfwPollEvents(); 16     }
View Code

 

渲染循環的模板:code

 1 // 渲染循環
 2 while(!glfwWindowShouldClose(window))  3 {  4     // 輸入
 5  processInput(window);  6 
 7     // 渲染指令
 8  ...  9 
10     // 檢查並調用事件,交換緩衝
11  glfwPollEvents(); 12  glfwSwapBuffers(window); 13 }
View Code

 

七.釋放資源:對象

1 //當渲染循環結束後咱們須要正確釋放/刪除以前的分配的全部資源
2     glfwTerminate();
View Code

 

完整代碼:

 1 // hello_window.cpp: 定義控制檯應用程序的入口點。  2 //  3 
 4 #include "stdafx.h"
 5 #include <glad/glad.h>
 6 #include <GLFW/glfw3.h>
 7 #include <iostream>
 8 
 9 
10 //當用戶改變窗口的大小的時候,視口也應該被調整。咱們能夠對窗口註冊一個回調函數(Callback Function), 11 //它會在每次窗口大小被調整的時候被調用
12 void framebuffer_size_callback(GLFWwindow *window, int width, int heigh) { 13     glViewport(0, 0, width, heigh); 14 } 15 
16 //使用GLFW的glfwGetKey函數,它須要一個窗口以及一個按鍵做爲輸入。這個函數將會返回這個按鍵是否正在被按下
17 void processInput(GLFWwindow *window) { 18     //這裏咱們檢查用戶是否按下了返回鍵(Esc)(若是沒有按下,glfwGetKey將會返回GLFW_RELEASE。 19     //若是用戶的確按下了返回鍵,咱們將經過glfwSetwindowShouldClose使用把WindowShouldClose屬性設置爲 true的方法關閉GLFW
20     if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) { 21         glfwSetWindowShouldClose(window, true); 22  } 23 } 24 
25 int main() 26 { 27     glfwInit();//使用glfw前必須用glgwInit函數來初始化glfw 28     //用glfwWindowHint函數來配置glfw 29     //咱們須要告訴GLFW咱們要使用的OpenGL版本是3.3 30     //將主版本號(Major)和次版本號(Minor)都設爲3
31     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//選擇主版本號
32     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//選擇次版本號 33     //咱們一樣明確告訴GLFW咱們使用的是核心模式(Core - profile)
34  glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 35     //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 36     //若是使用的是Mac OS X系統則須要將註釋的這句加上才能使這些設置生效 37 
38     //接下來咱們建立一個窗口對象,這個窗口對象存放了全部和窗口相關的數據, 39     //並且會被GLFW的其餘函數頻繁地用到
40     GLFWwindow *window = glfwCreateWindow(800, 600, "LearnOpengl", NULL, NULL); 41     //建立窗口,前兩個參數爲窗口的寬和搞,第三個參數表示窗口的標題,後兩個參數暫時不討論
42     if (window == NULL) { 43         std::cout << "failed to create glfw window" << std::endl; 44         glfwTerminate();//釋放以前分配的資源
45         return -1; 46  } 47     //建立完窗口通知GLFW將窗口的上下文設置爲當前線程的主上下文
48  glfwMakeContextCurrent(window); 49 
50     //GLAD是用來管理OpenGL的函數指針的,因此在調用任何OpenGL的函數以前 51     //咱們須要初始化GLAD 52     //咱們給GLAD傳入了用來加載系統相關的OpenGL函數指針地址的函數。GLFW給 53     //咱們的是glfwGetProcAddress,它根據咱們編譯的系統定義了正確的函數
54     if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { 55         std::cout << "failed to initialize glad" << std::endl; 56         return -1; 57  } 58 
59     //視口 60     //在咱們開始渲染以前還有一件重要的事情要作,咱們必須告訴OpenGL渲染窗口的尺寸大小, 61     //即視口(Viewport),這樣OpenGL才只能知道怎樣根據窗口大小顯示數據和座標。 62     //咱們能夠經過調用glViewport函數來設置窗口的維度
63     glViewport(0, 0, 800, 600);//前兩個參數控制左下角的位置,後兩個參數控制渲染窗口的寬度和高度(像素) 64     //注意和前面的GLFWwindow區別開來,GLFWwindow定義的是GLFW的維度 65     //咱們實際上也能夠將視口的維度設置爲比GLFW的維度小,這樣子以後全部的OpenGL渲染將會在一個更小 66     //的窗口中顯示,這樣子的話咱們也能夠將一些其它元素顯示在OpenGL視口以外 67 
68     //咱們還須要註冊回掉函數,告訴GLFW咱們但願每當窗口調整大小的時候調用這個函數
69  glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); 70     //當窗口被第一次顯示的時候framebuffer_size_callback也會被調用。對於視網膜(Retina)顯示屏,width和height都會明顯比原輸入值更高一點 71     //咱們還能夠將咱們的函數註冊到其它不少的回調函數中。好比說,咱們能夠建立一個回調函數來處理手柄輸入變化,處理錯誤消息等。咱們會在建立窗口以後, 72     //渲染循環初始化以前註冊這些回調函數 73 
74     //渲染循環,讓glfw退出前一直保持運動 75     //glfwWindowShouldClose函數在咱們每次循環的開始前檢查一次GLFW是否被要求退出,若是是的話該函數返回true而後渲染循環便結束了,以後爲咱們就能夠關閉應用程序了
76     while (!glfwWindowShouldClose(window)) { 77  processInput(window); 78 
79         //清除顏色緩衝以後,整個顏色緩衝都會被填充爲glClearColor裏所設置的顏色
80         glClearColor(1.0f, 0.0f, 0.0f, 1.0f); 81         //glClear函數清空屏幕的顏色緩衝
82  glClear(GL_COLOR_BUFFER_BIT); 83 
84         //glfwSwapBuffers函數會交換顏色緩衝(它是一個儲存着GLFW窗口每個像素顏色值的大緩衝), 85         //它在這一迭代中被用來繪製,而且將會做爲輸出顯示在屏幕上。不然只會顯示一片空白
86  glfwSwapBuffers(window); 87         //glfwPollEvents函數檢查有沒有觸發什麼事件(好比鍵盤輸入、鼠標移動等)、更新窗口狀態,並調用對應的回調函數(能夠經過回調方法手動設置)
88  glfwPollEvents(); 89  } 90 
91     //當渲染循環結束後咱們須要正確釋放/刪除以前的分配的全部資源
92  glfwTerminate(); 93 
94     return 0; 95 }
View Code
相關文章
相關標籤/搜索