WIN7 + VS2015环境下关于GLEW和GLFW的配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37027464/article/details/77972789

前言

现在是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 1;
    } 

    GLFWwindow* window = glfwCreateWindow (800, 600, "Hello Triangle", NULL, NULL);
    if (!window) {
        fprintf (stderr, "ERROR: could not open window with GLFW3\n");
        glfwTerminate();
        return 1;
    }
    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[] = {
        0.0f,  0.5f,  0.0f,
        0.5f, -0.5f,  0.0f,
        -0.5f, -0.5f,  0.0f
    };

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

    GLuint vao = 0;
    glGenVertexArrays (1, &vao);
    glBindVertexArray (vao);
    glEnableVertexAttribArray (0);
    glBindBuffer (GL_ARRAY_BUFFER, vbo);
    glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, 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, 1, &vertex_shader, NULL);
    glCompileShader (vs);
    GLuint fs = glCreateShader (GL_FRAGMENT_SHADER);
    glShaderSource (fs, 1, &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, 0, 3);
        // 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 0;
}

编译运行,成功的话,会实现以下窗口

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童鞋都能有一个好的开头。


梦不可怕,可怕的是没有梦

上一篇:C#.NET 剪切板复制粘贴泛型的例子代码参考 Clipboard Copy Paste List


下一篇:关于UGUI中Canvas无法移动的解决方法