1. 程式人生 > >OpenGL開發環境配置:VS2015+glew+glfw

OpenGL開發環境配置:VS2015+glew+glfw

opengl nop 一段 object 3.2 ext 裏的 rate 下載地址

折騰了一段時間,也在網上找了很多資料(有些真的不想吐槽),還是簡單小結一下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