前言
现在是OpenGL 4.5的时代,相对于 GLUT,GLEW 和 GLFW 显得更加的方便强大,但是如何实现配置和配置后出现BUG都是让人头疼的事情。笔者经过两天的不断尝试与查找资料,终于配置成功了。由于笔者也没有完全理解,所以我不确保这种方法适合于所有情况,只是希望给更多学习OpenGL的朋友提供一种方法。
开始工作
一.
首先:笔者建议你先查看你的显卡是否支持OpenGL 4.5版本
方法:百度下载GPU Caps Viewer双击打开
点击上方红色圆圈中可看到OpenGL的支持信息(黄色方框内容),如果你可支持的版本较低,笔者建议你更新驱动
二.
下载GLEW和GLFW源码,下载地址分别为
http://glew.sourceforge.net/
http://www.glfw.org/下载CMake
https://cmake.org/
三.
cmake子目录bin中有一个cmake-gui.exe,双击打开
得到以下界面
第一步,点击“Browsw source…”选择GLFW的根目录
第二步,点击“Browse build…”任意选取一个新建的文件夹作为输出目录
第三步,点击“Configure“,出现以下选择
选择Visual Studio 14 2015
第四步,出现以下界面时,点击“Generate”
稍等几秒,便可关闭CMake
四.
打开刚刚指定的Build目录(即你指定存放CMake输出的目录),用VS2015打开GLFW.sln文件
进行编译(需知:笔者在配置时这一步是不成功的,但是也得到了我想要的链接库文件)在你的\bulid\src\Debug中会有一个lib文件。同时,你下载的glfw文件中有一个include文件夹,其中有一个存放着头文件的GLFW文件夹。至此配置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控制台
②选择空项目
③项目->属性->VC++目录。 包含目录中添加上刚才准备的A(见第五步),库目录中添加上刚才准备的B(见第五步)
④项目->属性->链接器->输入。附加依赖项中添加上 glew32.lib ; glfw3.lib ; opengl32.lib 。由于是手写的,所以注意拼写。当然你直接复制上去也行。
⑤最后点击确定便配置完成了
七.最终测试.
新建一个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;
}
编译运行,成功的话,会实现以下窗口
第一行有可能报错,笔者上网查询后,把第一行代码删掉是可以的。
至此,如果你跟着所有步骤来做,一切顺利,没有意外的情况,且代码测试成功,那么恭喜你,完美配置成功。
不过……
对嘛,生活很难一帆风顺,吃个鸡蛋都有可能吃到蛋壳碎,这个程序有可能报许多错误,笔者来分享下个人的惨痛经历第一种:一大堆错误如下
观察错误提示,你会发现不少glew,glfw,gl的字眼或前缀,这说明和我们的库有关。解决方法如下,添加最上面的3行代码
第二种:无法打开glew32.lib文件
出现这个情况一定要确保三点:
①项目配置时,库目录添加的文件夹中是否有glew32.lib
②项目配置时,附加依赖项是否有添加glew32.lib
③glew32.dll是否有拷贝到C:\Windows\SysWOW64目录下再者glew32.lib文件是否损坏(这种情况一般都不会发生),如果确保了以上3点并重启过VS2015仍然报错,可尝试更换glew32.lib和glew32.dll文件
总结
这篇教程是我在网上查了许多资料,看了许多前辈的博客,再结合自身经历所写出来的,其中有许多知识笔者也是一知半解,也许存在着许多错误,不能保证每个人都可以成功配置,毕竟大家的计算机环境不尽相同。如果你在阅读过程中发现了错误,希望你能给我指正,相互学习。如果你按这个教程成功配置,那么说明我的努力是有一定价值的。最后希望各位想要学习OpenGL童鞋都能有一个好的开头。
梦不可怕,可怕的是没有梦