天天看點

WIN7 + VS2015環境下關于GLEW和GLFW的配置

前言

現在是OpenGL 4.5的時代,相對于 GLUT,GLEW 和 GLFW 顯得更加的友善強大,但是如何實作配置和配置後出現BUG都是讓人頭疼的事情。筆者經過兩天的不斷嘗試與查找資料,終于配置成功了。由于筆者也沒有完全了解,是以我不確定這種方法适合于所有情況,隻是希望給更多學習OpenGL的朋友提供一種方法。

開始工作

一.

首先:筆者建議你先檢視你的顯示卡是否支援OpenGL 4.5版本

方法:百度下載下傳GPU Caps Viewer

WIN7 + VS2015環境下關于GLEW和GLFW的配置
輕按兩下打開
WIN7 + VS2015環境下關于GLEW和GLFW的配置
點選上方紅色圓圈中可看到OpenGL的支援資訊(黃色方框内容),如果你可支援的版本較低,筆者建議你更新驅動

二.

下載下傳GLEW和GLFW源碼,下載下傳位址分别為

http://glew.sourceforge.net/

http://www.glfw.org/

下載下傳CMake

https://cmake.org/

三.

cmake子目錄bin中有一個cmake-gui.exe,輕按兩下打開
WIN7 + VS2015環境下關于GLEW和GLFW的配置
得到以下界面
WIN7 + VS2015環境下關于GLEW和GLFW的配置

第一步,點選“Browsw source…”選擇GLFW的根目錄

第二步,點選“Browse build…”任意選取一個建立的檔案夾作為輸出目錄

第三步,點選“Configure“,出現以下選擇

WIN7 + VS2015環境下關于GLEW和GLFW的配置

選擇Visual Studio 14 2015

第四步,出現以下界面時,點選“Generate”

WIN7 + VS2015環境下關于GLEW和GLFW的配置
稍等幾秒,便可關閉CMake

四.

打開剛剛指定的Build目錄(即你指定存放CMake輸出的目錄),用VS2015打開GLFW.sln檔案
WIN7 + VS2015環境下關于GLEW和GLFW的配置
進行編譯(需知:筆者在配置時這一步是不成功的,但是也得到了我想要的連結庫檔案)在你的\bulid\src\Debug中會有一個lib檔案。同時,你下載下傳的glfw檔案中有一個include檔案夾,其中有一個存放着頭檔案的GLFW檔案夾。至此配置GLFW的準備工作算是完成了
WIN7 + VS2015環境下關于GLEW和GLFW的配置
WIN7 + VS2015環境下關于GLEW和GLFW的配置
如果你實在不想動用CMake去做這麼麻煩的工作的話,你也可以直接在網上下載下傳glfw3.lib(此處滑稽:))

五.

進行glew的配置準備工作實際上是非常類似的,此處不再贅述,當然你還是可以直接在網上下載下傳glew32.lib。需要注意的是:還需要一個glew32.dll檔案,記得一同下載下傳。重要的事情說三遍,注意 x 3 !

然後把glew32.dll檔案拷貝到C:\Windows\SysWOW64目錄下。

筆者建議建立一個獨立檔案夾,裡面建立兩個檔案夾include(A)和lib(B)。把glfw中的include檔案夾裡面的GLFW 和 glew中的include檔案夾裡面的GL都拷貝到A中,然後把glfw3.lib 和 glew32.lib放在B中。至此是以準備工作完成了,開始配置了

六.

①打開VS2015,建立項目,選擇Win32控制台
WIN7 + VS2015環境下關于GLEW和GLFW的配置
②選擇空項目
WIN7 + VS2015環境下關于GLEW和GLFW的配置
③項目->屬性->VC++目錄。 包含目錄中添加上剛才準備的A(見第五步),庫目錄中添加上剛才準備的B(見第五步)
WIN7 + VS2015環境下關于GLEW和GLFW的配置
④項目->屬性->連結器->輸入。附加依賴項中添加上 glew32.lib ; glfw3.lib ; opengl32.lib 。由于是手寫的,是以注意拼寫。當然你直接複制上去也行。
WIN7 + VS2015環境下關于GLEW和GLFW的配置
⑤最後點選确定便配置完成了

七.最終測試.

建立一個cpp檔案,把以下代碼拷貝到檔案中。代碼來自Anton’s OpenGL 4 Tutorials
#include "stdafx.h"
#include <GL/glew.h>
//#define GLFW_DLL
#include <GLFW/glfw3.h>


int main(int argc, _TCHAR* argv[])
{
    // start GL context and O/S window using the GLFW helper library
    if (!glfwInit ()) {
        fprintf (stderr, "ERROR: could not start GLFW3\n");
        return ;
    } 

    GLFWwindow* window = glfwCreateWindow (, , "Hello Triangle", NULL, NULL);
    if (!window) {
        fprintf (stderr, "ERROR: could not open window with GLFW3\n");
        glfwTerminate();
        return ;
    }
    glfwMakeContextCurrent (window);

    // start GLEW extension handler
    glewExperimental = GL_TRUE;
    glewInit ();

    // get version info
    const GLubyte* renderer = glGetString (GL_RENDERER); // get renderer string
    const GLubyte* version = glGetString (GL_VERSION); // version as a string
    printf ("Renderer: %s\n", renderer);
    printf ("OpenGL version supported %s\n", version);

    // tell GL to only draw onto a pixel if the shape is closer to the viewer
    glEnable (GL_DEPTH_TEST); // enable depth-testing
    glDepthFunc (GL_LESS); // depth-testing interprets a smaller value as "closer"

    float points[] = {
        ,  ,  ,
        , -,  ,
        -, -,  
    };

    GLuint vbo = ;
    glGenBuffers (, &vbo);
    glBindBuffer (GL_ARRAY_BUFFER, vbo);
    glBufferData (GL_ARRAY_BUFFER,  * sizeof (float), points, GL_STATIC_DRAW);

    GLuint vao = ;
    glGenVertexArrays (, &vao);
    glBindVertexArray (vao);
    glEnableVertexAttribArray ();
    glBindBuffer (GL_ARRAY_BUFFER, vbo);
    glVertexAttribPointer (, , GL_FLOAT, GL_FALSE, , NULL);

    const char* vertex_shader =
        "#version 400\n"
        "in vec3 vp;"
        "void main () {"
        "  gl_Position = vec4 (vp, 1.0);"
        "}";

    const char* fragment_shader =
        "#version 400\n"
        "out vec4 frag_colour;"
        "void main () {"
        "  frag_colour = vec4 (0.5, 0.0, 0.5, 1.0);"
        "}";

    GLuint vs = glCreateShader (GL_VERTEX_SHADER);
    glShaderSource (vs, , &vertex_shader, NULL);
    glCompileShader (vs);
    GLuint fs = glCreateShader (GL_FRAGMENT_SHADER);
    glShaderSource (fs, , &fragment_shader, NULL);
    glCompileShader (fs);

    GLuint shader_programme = glCreateProgram ();
    glAttachShader (shader_programme, fs);
    glAttachShader (shader_programme, vs);
    glLinkProgram (shader_programme);

    // Loop until the user closes the window
    while (!glfwWindowShouldClose(window))
    {
        // wipe the drawing surface clear
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glUseProgram (shader_programme);
        glBindVertexArray (vao);
        // draw points 0-3 from the currently bound VAO with current in-use shader
        glDrawArrays (GL_TRIANGLES, , );
        // update other events like input handling 
        glfwPollEvents ();
        // put the stuff we've been drawing onto the display
        glfwSwapBuffers (window);
    }

    // close GL context and any other GLFW resources
    glfwTerminate();

    return ;
}
           
編譯運作,成功的話,會實作以下視窗
WIN7 + VS2015環境下關于GLEW和GLFW的配置

第一行有可能報錯,筆者上網查詢後,把第一行代碼删掉是可以的。

至此,如果你跟着所有步驟來做,一切順利,沒有意外的情況,且代碼測試成功,那麼恭喜你,完美配置成功。

不過……

對嘛,生活很難一帆風順,吃個雞蛋都有可能吃到蛋殼碎,這個程式有可能報許多錯誤,筆者來分享下個人的慘痛經曆

第一種:一大堆錯誤如下

WIN7 + VS2015環境下關于GLEW和GLFW的配置
觀察錯誤提示,你會發現不少glew,glfw,gl的字眼或字首,這說明和我們的庫有關。解決方法如下,添加最上面的3行代碼
WIN7 + VS2015環境下關于GLEW和GLFW的配置

第二種:無法打開glew32.lib檔案

出現這個情況一定要確定三點:

①項目配置時,庫目錄添加的檔案夾中是否有glew32.lib

②項目配置時,附加依賴項是否有添加glew32.lib

③glew32.dll是否有拷貝到C:\Windows\SysWOW64目錄下

再者glew32.lib檔案是否損壞(這種情況一般都不會發生),如果確定了以上3點并重新開機過VS2015仍然報錯,可嘗試更換glew32.lib和glew32.dll檔案

總結

這篇教程是我在網上查了許多資料,看了許多前輩的部落格,再結合自身經曆所寫出來的,其中有許多知識筆者也是一知半解,也許存在着許多錯誤,不能保證每個人都可以成功配置,畢竟大家的計算機環境不盡相同。如果你在閱讀過程中發現了錯誤,希望你能給我指正,互相學習。如果你按這個教程成功配置,那麼說明我的努力是有一定價值的。最後希望各位想要學習OpenGL童鞋都能有一個好的開頭。
夢不可怕,可怕的是沒有夢

繼續閱讀