OpenGL學習筆記(七):建立第一個Qt5.9.3 OpenGL工程模版(與平臺無關)
阿新 • • 發佈:2019-01-10
main.cpp中輸入原始碼,原始碼如下:
#include <iostream> #include <process.h> #include <GLFW/glfw3.h> #include <glad/glad.h> #include <windows.h> void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); } // 在GLFW中實現一些輸入控制,使用GLFW的glfwGetKey函式 void processInput(GLFWwindow *window) { if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true); } int main() { glfwInit(); /* 請確認您的系統支援OpenGL3.3或更高版本,否則此應用有可能會 崩潰或者出現不可預知的錯誤。如果想要檢視OpenGL版本的話, 在Linux上執行glxinfo,或者在Windows上使用其它的工具(例如 OpenGL Extension Viewer)。如果你的OpenGL版本低於3.3,檢 查一下顯示卡是否支援OpenGL 3.3+(不支援的話你的顯示卡真的太老 了),並更新你的驅動程式,有必要的話請更新顯示卡。 */ glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 如果使用的是Mac OS X系統,你還需要加下面這行程式碼到你的 // 初始化程式碼中這些配置才能起作用 //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 建立一個視窗物件,這個視窗物件存放了所有和視窗相關的資料, // 而且會被GLFW的其他函式頻繁地用到 // glfwCreateWindow函式需要視窗的寬和高作為它的前兩個引數。 // 第三個引數表示這個視窗的名稱(標題),最後兩個引數暫時忽略。 // 函式會返回一個GLFWwindow物件,我們會在其它的GLFW操作中使用到。 GLFWwindow* window = glfwCreateWindow(800, 600, "QQ:21497936", NULL, NULL); if (window == NULL) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); // GLAD是用來管理OpenGL的函式指標的,所以在呼叫任何OpenGL的函式 // 之前我們需要初始化GLAD。 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; return -1; } // 還需要註冊這個函式,告訴GLFW我們希望每當視窗調整大小的時候呼叫這個函式。 glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); // 我們必須告訴OpenGL渲染視窗的尺寸大小,即視口(Viewport), // 這樣OpenGL才只能知道怎樣根據視窗大小顯示資料和座標。 // 可以通過呼叫glViewport函式來設定視窗的維度(Dimension)。 // OpenGL幕後使用glViewport中定義的位置和寬高進行2D座標的轉 // 換,將OpenGL中的位置座標轉換為你的螢幕座標。例如,OpenGL // 中的座標(-0.5, 0.5)有可能(最終)被對映為螢幕中的座標(200,450)。 // 注意,處理過的OpenGL座標範圍只為-1到1,因此我們事實上 // 將(-1到1)範圍內的座標對映到(0, 800)和(0, 600)。 glViewport(0, 0, 800, 600); // 在我們主動關閉它之前不斷繪製圖像並能夠接受使用者輸入。因此, // 需要在程式中新增一個while迴圈,我們可以把它稱之為渲染迴圈(Render Loop), // 它能在我們讓GLFW退出前一直保持執行。 while (!glfwWindowShouldClose(window)) { // 捕捉輸入 processInput(window); // 清空顏色緩衝 // 新增渲染指令,背景RGBA的A不生效 glClearColor(1.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); // 檢查並呼叫事件,交換緩衝(執行交換快取才會更新新資料到介面) glfwSwapBuffers(window); glfwPollEvents(); } // 當渲染迴圈結束後我們需要正確釋放/刪除之前的分配的所有資源。 glfwTerminate(); return 0; }
編譯時遇到錯誤,找不到一些函式: