在我们画出五彩缤纷的效果之前,我们需要一个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>
即可。
以上就是开发环境配置的全部内容,我们会在下一篇正式开始。