一、环境搭建
1.搭建GLFW库
在使用OpenGL渲染效果之前,首先要做的就是创建OpenGL的上下文(Context)和窗口,这依赖于OpenGL的库提供接口,比较常见的库有GLUT、SDL、 GLFW等,在这里我们使用的是GLFW库,因为它是专门针对OpenGL的C语言库,它提供了渲染所使用的的最低限度的接口和创建窗口的一些参数。
在网上搜了一下GLFW的配置方法,大部分都是下载官网下载GLFW,然后再下载cmake编译IDE和所需的dll,这么做既复杂又麻烦,我们使用的是VS2015,完全可以使用VS提供的NuGet包来按安装所需的库来配置OpenGL环境。
首先,打开VS2015菜单栏中的项目,单击管理NuGet程序包,搜索nupengl,选中如图所示的两个包下载安装即可:
下载的库会保存在当前项目的nupengl路径下:
然后在工程中引用即可(#include "GLFW\glfw3.h")
2.搭建GLAD库
OpenGL只是一个标准和规范,具体的实现由驱动开发商针对特定的显卡来实现。OpenGL的驱动版本众多,实现时无法确定所需的函数的位置,所以需要安装GLAD库,它可以在运行时找到函数的地址并保存到一个函数指针中以便后续使用。
GLAD使用了一个在线服务(点击它进行配置),选择语言为C/C++,版本设置为3.3以上(这里我们使用version3.3的版本),然后将模式设置为Core,设置完后,点击生成:
将生成的glad.zip解压后,会得到两个头文件(glad和KHR)和一个glad.c,将这两个头文件复制到nuengl路径下,并将glad.c添加到工程:
这样环境就搭建好了,接下来就是创建第一个OpenGL窗口了!
二、创建OpenGL窗口
首先打开VS2015,创建一个空项目和一个.cpp文件,然后包含GLAD和GLFW头文件,注意:在包含GLFW头文件之前一定要确认先包含GLAD的头文件,因为GLAD中包含了正确的OpenGL头文件GL\gl.h,所以在包含其他OpenGL依赖之前一定要确保包含了GLAD头文件,先上代码,然后再对每一行代码进行解释。
#include "Glad\glad.h"
#include "GLFW\glfw3.h"
#include <iostream>
int main(int argc, char *argv[])
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_ANY_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow *window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (NULL == window)
{
std::cout << "Create Windows Failed" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Load Failed" << std::endl;
return -1;
}
glViewport(0, 0, 800, 600);
while (!glfwWindowShouldClose(window))
{
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
编译时,报错LNK2019 无法解析的外部符号 _gladLoadGLLoader,该符号在函数 _main 中被引用,这是因为工程中没有加载glad.c文件,将这个文件加载进来就可以了。
运行结果:创建了一个800*600的窗口
下面对每一行代码进行解释
glfwInit();初始化GLFW库
glfwWindowHint();设置GLFW库,第一个参数是所设置的模式,第二个参数是为第一个参数设置的值 。这里我们设置的模式为主版本和副版本,因为使用的是3.3的版本,所以设置的值是3,然后设置模式为核心模式
以上是对GLFW库的初始化和设置
glfwCreateWindow();创建窗口,前两个参数是窗口的宽高,第三个是窗口的标题,后两个参数暂时忽略
glfwMakeContextCurrent();通知GLFW将窗口的上下文设置为当前线程的主上下文
gladLoadGLLoader();初始化GLAD,之前提到过,在调用任何OpenGL的函数之前,一定要先初始化GLAD,参数是加载系统相关OpenGL函数指针地址的函数,它根据编译系统定义了正确的函数
glViewport();视口,即渲染窗口的大小,前两个参数是左下角位置,后两个参数是视口的宽高
glfwWindowShouldClose();我们不希望在绘制后立马推出窗口,所以使用这个循环来监听,只要用户没有输入关闭窗口之前保证绘制不断
glfwPollEvents();检查有没有输入事件(键盘、鼠标等)
glfwSwapBuffers();交换缓冲,它是 存储窗口每一个颜色的大缓冲
glfwTerminate();释放(删除)之前分配的资源,并正确退出