1.下载glfw源码,解压,CMake,使用vs2013编译得glfw3.lib库。如下所示:
2.将编译好的glfw3.lib以及它的include目录,拷贝出来,单独创建一个3rd目录存放。以便之后IDE的链接:如:
3.opengl32.lib在安装vs时,已经默认安装了。
4.由于opengl驱动版本众多,大多数函数的位置需要在运行时查询,在编译时时无法确定的。因此,需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用,Windows上一般是如下方法:
// 定义函数原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正确的函数并赋值给函数指针
GL_GENBUFFERS glGenBuffers = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 现在函数可以被正常调用了
GLuint buffer;
glGenBuffers(1, &buffer);
但是该代码复杂繁琐,要对每个需要使用到的函数都重复使用该过程,因此,就有了GLAD库来解决这个问题。
5.GLAD库的配置:
它是一个开源库,同时它还有一个在线服务:在线服务作用是生成库文件。可如下配置选项:
1.语言选择C/C++;2.gl版本选择3.3以上;3.profile选择Core;4.选中生成加载器;5.其他扩展项不选;6.点击生成
得到:
下载文件glad.zip,得到khrplatform.h以及glad.h头文件,以及glad.c库文件;将glad.c与opengl源程序放一起,随后要添加进工程源文件中,两个头文件与glfw3的头文件放一起。
之后,就可以在opengl源程序头部加上以下包含语句:
#include<glad/glad.h>
6.创建一个空项目来验证一下环境,在IDE或vcxproj将链接配置好后,输入以下代码:
#include <glad/glad.h>
#include <GLFW/glfw3.h>
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
return 0;
}
如果报了类似如下的错误:
错误 1 error LNK2001: 无法解析的外部符号 _glfwInit F:\temp\opengl\src\openglTest\openglTest\main.obj openglTest
1.可能是glfw库使用64位编译,而该验证工程又是32位,把32位改为64位即可解决。
2.可能是机器不支持opengl3.3+版本,可使用工具OpenGL Extensions Viewer检查一下,若不支持,更新驱动;若显卡不支持3.3,则更新显卡。
最终验证代码如下:
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
void framebuffer_size_callback(GLFWwindow *window, int width, int height);
void processInput(GLFWwindow *window);
int main()
{
glfwInit();//初始化glfw
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//配置glfw,告诉glfw需要使用的opengl版本号为3.3
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//配置glfw,告诉glfw需要使用的opengl版本号为3.3
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//告诉glfw使用的是核心模式,即只能使用opengl功能的一个子集,不需要3.3之后版本的兼容功能。
GLFWwindow* window = glfwCreateWindow(800, 600, "testOpengl", NULL, NULL);//创建窗口对象,该对象存放所有与窗口相关数据,且会被GLFW其他函数调用。
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) //初始化glad
{
std::cout << "faild to initialize GLAD" << std::endl;
return -1;
}
glViewport(0, 0, 800, 600);//告诉opengl渲染窗口的尺寸大小,视口(-1~1)对应GLFW的(0,800)以及(0,600);该维度也可设置的比glfw小
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);// 告诉glfw,每当窗口调整大小时,调用此函数
while (!glfwWindowShouldClose(window))//每次循环开始前检查一次GLFW是否被要求退出,若是则函数返回true,则渲染循环便结束。
{
processInput(window);//处理输入事件
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); //设置清空屏幕所用的颜色(状态设置函数)
glClear(GL_COLOR_BUFFER_BIT);//清楚颜色缓冲区之后,整个颜色缓冲会被填充glClearColor里所设置的颜色,深蓝绿色(状态使用函数)。
glfwPollEvents();//检查是否触发事件(如键盘输入,鼠标移动等),更新窗口状态,并调用对应回调函数
glfwSwapBuffers(window);//交换颜色缓冲,存储GLFW窗口没个像素颜色值的大缓冲,它在迭代中用来绘制图像,并输出到显示屏上
}
glfwTerminate(); //清理申请的资源,退出
return 0;
}
void framebuffer_size_callback(GLFWwindow *window, int width, int height) //调整视口大小
{
glViewport(0, 0, width, height);
std::cout << "viewport width:" << width << std::endl;
std::cout << "viewport height:" << height << std::endl;
}
void processInput(GLFWwindow *window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) //按下escape键,关闭glfw
{
glfwSetWindowShouldClose(window, true);
}
}
输出: