一、准備工作
創建Empty Project,為了能夠使用OpenGL的庫函數,需要把相關的庫連接到項目中:
1、首先添加庫的路徑


如上,可以把需要添加的include、lib放到一起比較方便管理
這時候,VS就能找到所有需要的文件了。
2、然后把相關庫鏈接到項目中,




注:GLFW是一個C寫的專門用於OpenGL開發的庫,它只提供把物體渲染到屏幕所需的必要功能。它可以給我們創建一個
OpenGL環境,定義窗口參數,以及相應用戶輸入,這些都是必要的功能。
本節使用GLFW,但是鏈接的時候除了GLFW,把OpenGL庫也添加上了,這里,OpenGL庫的添加是和
操作系統有關的。
本文使用的是windows,Microsoft SDK提供了一個opengl32.lib,是vs自帶的,所以我們這里鏈接的是opengl32.lib。
另外,對於不同版本的OpenGL,管理各個版本之間函數調用,通過GLEW這個庫實現,也需要添加這個的鏈接。
如果你使用GLEW的靜態庫,我們必須在包含GLEW之前定義一個預處理變量GLEW_STATIC。
#DEFINE GLEW_STATIC #include <GL/glew.h>
至此,我們的准備工作已經完成。
---------------
glfw是輔助創建openGL窗口的開源庫.所以在后面配置工程的時候你會發現我們根本就不需要用到MFC窗口框架的,只需要console工程即可
glew是暴露openGL的通用API的開源庫,
glm是openGL開發中常用的數學庫,主要是一些矩陣變化. 但是該庫里面的源文件都是以.hpp這種不用編譯的后綴形式存在,所以只要include就行,在此環境配置中不用理會.
---------------
二、openGL操作過程
1、初始化、配置GLFW
2、初始化、配置GLEW
3、設置窗口維度
4、消息循環、渲染
5、釋放資源
相應例子代碼:
// GLEW #define GLEW_STATIC #include <GL/glew.h> // GLFW #include <GLFW/glfw3.h> #include<iostream> //Function prototypes void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode); // Window dimensions const GLuint WIDTH = 800, HEIGHT = 600; // The MAIN function, from here we start the application and run the game loop int main() { std::cout << "Starting GLFW context, OpenGL 3.3" << std::endl; // 初始化GLFW glfwInit(); // 配置 GLFW glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); // 創建 GLFW 窗口 GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr); if (window == nullptr) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } //通知GLFW將我們窗口的上下文設置為當前線程的主上下文 glfwMakeContextCurrent(window); // 為窗口設置回調函數(事件響應) glfwSetKeyCallback(window, key_callback); // 讓GLEW在管理OpenGL的函數指針時更多地使用現代化的技術 glewExperimental = GL_TRUE; // 初始化GLEW if (glewInit() != GLEW_OK) { std::cout << "Failed to initialize GLEW" << std::endl; return -1; } //設置窗口的維度,即告訴OpenGL渲染窗口的尺寸大小 //我們實際上也可以將視口的維度設置為比GLFW的維度小, //這樣子之后所有的OpenGL渲染將會在一個更小的窗口中顯示, //這樣子的話我們也可以將一些其它元素顯示在OpenGL視口之外。 int width, height; glfwGetFramebufferSize(window, &width, &height); glViewport(0, 0, width, height); // 游戲循環 while (!glfwWindowShouldClose(window)) { //檢查有沒有觸發什么事件(比如鍵盤輸入、鼠標移動等),然后調用對應的回調函數 glfwPollEvents(); // Render // Clear the colorbuffer glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // 交換顏色緩沖 glfwSwapBuffers(window); } // 釋放/刪除之前的分配的所有資源 glfwTerminate(); return 0; } // Is called whenever a key is pressed/released via GLFW void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode) { std::cout << key << std::endl; if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) glfwSetWindowShouldClose(window, GL_TRUE); }