欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-11 20:53:02
...

前言

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


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