OpenGL的接口实现是显卡商实现的(相关库函数由gl开头),OpenGL只是一套标准,只要电脑有显卡驱动,就有OpenGL的函数库,如果还没驱动,可以从这下载对应你电脑的显卡驱动。
GLFW是现在较流行、使用广泛的OpenGL的界面库,而glut库已经比较老了。GLEW是和管理OpenGL函数指针有关的库,因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询,而GLEW可以解决这些问题。
一.下载 GLFW,GLEW
到这GLFW官网下载GLFW32位版本,大家普遍下载32位版本,64位可能还不太完善,容易出问题,为了不必要的麻烦推荐下载32位版本。下载后,解压到自己指定的位置;
到这GLEW官网下载GLEW32位版本,然后解压
二. 配置GLFW
如果要使用GLFW库,就要将它和Visual Studio(准确来说是VS下的VC++)链接起来,有两种方法。
1.第一种方法,在工程的属性管理器包含GLFW的相关库
新建一个Visual C++的空项目,在右下边选中属性管理器,鼠标右击工程名字project1,选择属性。也可以鼠标右击工程名字,在菜单列表最下面可以看到属性。
(1)在属性面板里选中VC++目录-->包含目录,右边下拉开始编辑
找到解压后的glfw-3.2.1.bin.WIN32文件下/include/的位置,将路径加进去,我的是D:\Another\glfw-3.2.1.bin.WIN32\include,然后点击确定和应用
(2)在属性面板里选中VC++目录-->库目录,右边下拉进行编辑,将文件里的lib-vc2013路径加进去,我的是D:\Another\glfw-3.2.1.bin.WIN32\lib-vc2013,点击确定和应用
(3)属性面板找到链接器-->输入,选中附加依赖项,在里面添加glfw3.lib,glfw3dll.lib,opengl32.lib,只是添加文件的名字,注意这些名字不要错了,不要用逗号分隔,要用换行。然后点击确定和应用
(4)在D:\Another\glfw-3.2.1.bin.WIN32\lib-vc2013下复制glfw3.dll文件,如果电脑是64位系统就将它放到C:\Windows\SysWOW64目录下,如果是32位系统,就放到C:\Windows\System32下,如果不清楚自己电脑32位还是64,就两个地方都放一份glfw3.dll
2.第二种方法,在Visual Studio安装目录下的VC文件夹下,添加GLFW相关库
打开刚才下载、解压后的 glfw-3.2.1.bin.WIN32 文件,我的是这样:
(1)将include中的GLFW文件夹拷贝到VS安装目录下的VC/include中
(2)我的是使用VS2013,就将lib-vc2013中的lib文件拷贝到VS2013安装目录下的VC/lib中,如果是VS2015就选择lib-vc2015中的lib文件拷贝到VS2015安装目录下的VC/lib中
(3)在D:\Another\glfw-3.2.1.bin.WIN32\lib-vc2013下复制glfw3.dll文件,如果电脑是64位系统就将它放到C:\Windows\SysWOW64目录下,如果是32位系统,就放到C:\Windows\System32下,如果不清楚自己电脑32位还是64,就两个地方都放一份glfw3.dll
(4)和第一种方法的第三步一样,在属性面板属性面板找到链接器-->输入,选中附加依赖项,在里面添加glfw3.lib,glfw3dll.lib,opengl32.lib,然后点击确定和应用
三.配置GLEW库
配置GLEW库和配置GLFW差不多一样,也有两种方法,只不过链接的库名字不一样罢了,可以在属性管理器里包含相关lib和include文件的路径,也可以将lib和include里的文件分别拷贝到vs安装目录下VC里lib和include文件夹下面。还有就是,因为有静态链接和动态链接的选择,所以配置GLEW又有两种不同方式。注意:配置静态链接和动态链接不一样,在代码里包含头文件也不一样。先找到之前下载、解压好的glew-1.13.0文件,我的是这样:
这里我使用第二种方法:
(1)将include中的GL文件夹拷贝到VS安装目录下的VC/include中,如果已经存在GL文件夹,就合并
(2)将glew-1.13.0\lib\Release\Win32中的lib文件拷贝到VS2013安装目录下的VC/lib中
(3)在glew-1.13.0\bin\Release\Win32下复制glew32.dll文件,如果电脑是64位系统就将它放到C:\Windows\SysWOW64目录下,如果是32位系统,就放到C:\Windows\System32下
(4)因为有静态链接和动态链接的选择,所以有两种不同方式,请看下面
1.静态链接配置的关键点:
在属性面板里,找到链接器-->输入,选中附加依赖项,编辑,在里面添加glew-1.13.0文件里的glew32s.lib(注意有s,static是静态的意思),然后点击确定、应用,注意:如果glew32s.lib(有s)和glew32.lib都在里面,那么glew32s.lib(有s)在glew32.lib前面,最好是,静态链接就只添加glew32s.lib,动态的就只加glew32.lib
在代码里,在最前面应该是这样,注意:#define GLEW_STATIC应该在#include <GL/glew.h>前面,#include <GL/glew.h>在#include<GLFW/glfw3.h>前面
2.动态链接配置的关键点:
在属性面板里,找到链接器-->输入,选中附加依赖项,编辑,在里面添加glew-1.13.0文件里的glew32.lib(自己找),然后点击确定、应用
然后在glew-1.13.0文件里找到glew32.dll,把它放到你的工程里
在代码里,只需要#include <GL/glew.h>就可以
4.这里我选择静态链接来测试,此时工程文件里不应该出现glew32.dll
#define GLEW_STATIC
#include <GL/glew.h>
#include<GLFW/glfw3.h>
#include<iostream>
/* 注意:#define GLEW_STATIC 在 #include<GL/glew.h>前面,
* #include<GL/glew.h>在#include<GLFW/glfw3.h>前面
*/
using namespace std;
/*创建键盘输入的回调函数*/
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
{
// 当用户按下ESC键,我们设置window窗口的WindowShouldClose属性为true
// 关闭应用程序
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
}
int main()
{
/*初始化GLFW*/
glfwInit();
/*配置GLFW窗口*/
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 4);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
/*创建窗口*/
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);
if (window == nullptr)
{
cout << "Failed to create GLFW window" << endl;
glfwTerminate();
return -1;
}
/*通知GLFW将我们窗口的上下文设置为当前线程的主上下文*/
glfwMakeContextCurrent(window);
/*GLEW是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们需要初始化GLEW*/
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
{
cout << "Failed to initialize GLEW" << endl;
return -1;
}
/*告诉OpenGL渲染窗口的尺寸大小,这样OpenGL才只能知道怎样相对于窗口大小显示数据和坐标*/
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);
/*注册回调函数*/
glfwSetKeyCallback(window, key_callback);
/*事件循环*/
while (!glfwWindowShouldClose(window))
{
glfwPollEvents();
/*函数检查有没有触发什么事件(比如键盘输入、鼠标移动等),
*然后调用对应的回调函数(可以通过回调方法手动设置)。
我们一般在游戏循环的开始调用事件处理函数
*/
// 这里写渲染指令
glfwSwapBuffers(window);
/*函数会交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色的大缓冲),
*它在这一迭代中被用来绘制,并且将会作为输出显示在屏幕上
*/
}
/*释放GLFW分配的内存*/
glfwTerminate();
return 0;
}
运行成功则配置完成,哈哈