OpenGL開發環境配置:VS2015+glew+glfw
折騰了一段時間,也在網上找了很多資料(有些真的不想吐槽),還是簡單小結一下Win8上面,OpenGL的開發環境搭建方法,其實並沒有那麽復雜。
1. 我的目標環境
環境:VS2015+glew+glfw
2. 下載glew和glfw源碼
2.1 下載源碼
首先,需要準備glew和glfw庫,這樣可以直接拿使用;也可以下載glew和glfw的源碼,自己編譯。這裏我選擇自己下載編譯。
下載地址:
glfw:https://www.glfw.org/download.html (這個太慢了),備份:https://sourceforge.net/projects/glfw/
glew:http://glew.sourceforge.net/ (我是打不開這個),備份:http://sourceforge.mirrorservice.org/g/gl/glew/glew/2.1.0/
2.2 編譯
2.2.1 編譯glew-2.1.0
下載下來的glew源碼如下圖所示
使用vs2015打開build/vc12目錄下面解決方案文件glew.sln,此時會提示要升級一些項目配置文件,直接確認升級即可。然後直接build即可(可選類型debug或release),一般不會出錯,直接就ok了。此時,我們得到了兩個lib文件,註意debug模式和release模式得到的文件名不同,這個沒有關系,只要後面配置的時候,配置對應名字即可。build成功後,結果如下圖所示。
2.2.2 編譯glfw-3.2.1
glfw-3.2.1的編譯分兩步,首先需要先使用cmake生成vs2015項目的sln文件,然後再使用vs2015編譯出所需的lib文件。
(1)打開cmake,在source code欄選擇glfw的源碼目錄,然後在陳澤民ries欄選擇存放編譯結果的輸出目錄,然後點擊左下角的configure按鈕,選擇對應的vs2015版本並確認,最後點擊Generate按鈕,即可生成對應的vs2015項目相關文件。使用vs2015打開GLFW.sln文件,直接進行編譯,即可在src目錄下得到所需的glfw3.lib文件(同樣分為debug和release版本)。
3. 創建第一個OpenGL項目
使用VS2015先創建一個最簡單的控制臺項目(最經典的Hello World即可),先確保基本運行環境沒有問題。
我的項目目錄如下,include目錄用於存在頭文件,libs目錄用來存放lib庫文件,source用於存在源碼目錄。接下來,要做兩個準備工作:
(1) 把2.2.1中編譯好的glew的include目錄下面的文件(夾)和2.2.2中glfw源碼目錄中的include下面的內容拷貝到我們這裏的include目錄下面;
(2.)把2.21中編譯好的lib庫文件(以debug為例:glew32d.lib和glew32sd.lib)和2.2.2編譯出來的glfw3.lib(同樣也是debug類型)拷貝到這裏的libs目錄下面;
做好了上面的準備工作後,需要在項目裏面進行一些配置,把這些頭文件和庫文件包含進來:
(1)添加頭文件包含目錄:Configureation Properties → C/C++ → General → Additional Include Directories,在這裏添加我們自己他們的include目錄的位置
(2)添加依賴庫文件的位置
(3)添加依賴庫文件的名字,註意,這裏不僅添加剛才我們自己編譯出來的3個lib庫文件,而且還額外添加了一個opengl32.lib,這個庫文件已經存在存在於系統的lib庫目錄中,因此直接在這裏添加名字即可。如果不添加這個opengl32.lib文件,在編譯時會出現一些找不到符號的錯誤,網上很多博客只是簡單地說明加這個庫,並沒有把這個關系說清楚,對於完全不懂的人來講,很難理解這個具體的原因是什麽。
此時,所有的準備和配置操作都已經完成。
4. 運行第一個OpenGL程序
這裏我直接從其他地方找了一個demo代碼:
#include <iostream> // GLEW #define GLEW_STATIC #include <GL/glew.h> // GLFW #include <GLFW/glfw3.h> // 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; // Init GLFW glfwInit(); // Set all the required options for 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); // Create a GLFWwindow object that we can use for GLFW‘s functions GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr); if (window == nullptr) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); // Set the required callback functions glfwSetKeyCallback(window, key_callback); // Set this to true so GLEW knows to use a modern approach to retrieving function pointers and extensions glewExperimental = GL_TRUE; // Initialize GLEW to setup the OpenGL Function pointers if (glewInit() != GLEW_OK) { std::cout << "Failed to initialize GLEW" << std::endl; return -1; } // Define the viewport dimensions glViewport(0, 0, WIDTH, HEIGHT); // Game loop while (!glfwWindowShouldClose(window)) { // Check if any events have been activiated (key pressed, mouse moved etc.) and call corresponding response functions glfwPollEvents(); // Render // Clear the colorbuffer glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // Swap the screen buffers glfwSwapBuffers(window); } // Terminate GLFW, clearing any resources allocated by GLFW. 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); }
順利的話,就可以看到運行結果如下:
OpenGL開發環境配置:VS2015+glew+glfw