在我们画出五彩缤纷的效果之前,我们需要一个OpenGL上下文,和一个用于显示的窗口。而创建这些是跟操作系统相关的,所以这些工作只能落在了开发者头上。
幸运的是,已经有一些库能够帮我们创建窗口,和定义OpenGL上下文。
这些库当中比较流行的有glut、glfw、SDL、Qt5。
在这里,我们使用glfw来创建窗口和OpenGL上下文。
GLFW
glfw是一个专门针对OpenGL的C语言开源库,它提供了一些可以用于创建窗口、OpenGL上下文和处理用户的输入的接口。在这一篇,我们会搭建glfw的开发环境,并在下一篇中用它创建一个窗口。
glfw可以直接到官网去下载编译完成的版本(注意下载32位的版本,除非你知道你在做什么)。不过如果你愿意的话也可以在github下载源码然后自行编译(源码包下载似乎快一点,之后只要CMake一下再用IDE打开并编译就行了)。
我们在有了glfw的二进制文件之后,如果你比较懒那么你可以直接将glfw3.lib文件扔到IDE的\Lib目录中并找到glfw3.h头文件将其扔到IDE的\Include目录中。不过更推荐的做法是将这两个文件单独放在一个指定的文件夹里,这样需要用glfw的时候只需要在IDE的库文件以及头文件搜索目录中添加即可。
* 注意:如果你是用CMake创建一个IDE的项目并手动编译的话那么你可以在你指定的生成目录中的\src\Debug\目录找到。
GLAD
在我们配置完glfw之后,依旧没有结束。因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针*以后使用。取得地址的方法因平台而异,在Windows上会是类似这样:
// 定义函数原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正确的函数并赋值给函数指针
GL_GENBUFFERS glGenBuffers = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 现在函数可以被正常调用了
GLuint buffer;
glGenBuffers(1, &buffer);
可以看到代码非常复杂,而且很繁琐,我们需要对每个可能使用的函数都要重复这个过程。而虽然Microsoft SDK中包含了gl.h和opengl32.lib,但是由于其只有1.1版本的软件实现,所以这个过程是不可避免的。
幸运的是,有些库能简化此过程,其中glad是目前最新,也是最流行的库。
glad是一个开源的库,它能够帮我们加载各个函数。glad通过一个在线服务,在这里我们可以指定OpenGL的版本,然后glad的在线服务会返回指定的文件。
打开glad的在线服务,在语言(Language)一栏中选择C/C++,并在API选项中选择OpenGL(gl)3.3或以上的版本,并在Profile选项中选择核心模式(Core)。记得勾选Generate a loader(生成加载器)。
然后,点击生成(Generate)然后我们会看到有一个文件名为glad.zip,下载这个文件,然后解压。
解压之后你会看到源文件和两个头文件目录,将源文件目录里的glad.c放在一个方便查找的地方,并且将两个头文件目录(GLAD和KHR)复制在IDE的包含目录中。
之后要用到glad的时候只需要将glad.c放到工程中,并在需要使用glad.c的文件添加上#include <glad/glad.h>
即可。
以上就是开发环境配置的全部内容,我们会在下一篇正式开始。