首先我们需要一个OpenGL上下文(context)和一个用于显示的窗口。这些操作在每个系统上都是不一样的,我们需要自己处理创建窗口,定义OpenGL上下文以及处理用户输入。
我们可以选择使用库来节省我们书写操作系统相关代码的时间,这些库可以提供给我们一个窗口和一个OpenGL上下文用来渲染。流行的库有很多,比如GLUT,SDL,SFML,GLFW等。我们使用GLFW。
GLFW
GLFW是一个专门针对OpenGL的C语言库。
构建GLFW,先去clone源码,GitHub - glfw/glfw: A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input
虽然GLFW提供了预编译好的二进制版本和相应的头文件。但由于完整性、操作系统的不同、ide版本不同,我们选择下载源码自己编译,这样能够保证生成的库完全适合你的操作系统和CPU。
CMake
CMake 是一个跨平台的自动化构建系统工具。使用CMake构建编译GLFW库
下载:https://cmake.org/download/
安装好了之后打开cmake-gui,source目录选择clone下来的源码目录,build目录自己根据需要新建一个放起来,点击configure,会根据你本机的vs配置最终的库,直接使用默认设置就可以了。 然后点击generate按钮生成工程文件。
编译
在build文件夹里找到GLFW.sln文件,用vs打开。因为CMake已经配置好了项目,按照默认配置将其编译为64位的库,所以我们直接生成解决方案。
然后在build/src/Debug文件家就会出现我们编译的库文件 glfw3.lib
库生成完毕后,我们需要让ide知道库和头文件的位置。有两种方法
- 找到IDE或者编译器的/lib和/include文件夹,添加GLFW的include文件夹里的文件到IDE的/include文件夹里去。用类似的方法,将glfw3.lib添加到/lib文件夹里去。虽然这样能工作,但这不是推荐的方式,因为这样会让你很难去管理库和include文件,而且重新安装IDE或编译器可能会导致这些文件丢失。
- 推荐的方式是建立一个新的目录包含所有的第三方库文件和头文件,并且在你的IDE或编译器中指定这些文件夹。我个人会使用一个单独的文件夹,里面包含Libs和Include文件夹,在这里存放OpenGL工程用到的所有第三方库和头文件。这样我的所有第三方库都在同一个位置(并且可以共享至多台电脑)。然而这要求你每次新建一个工程时都需要告诉IDE/编译器在哪能找到这些目录。
然后新建一个工程,在工程的属性中,配置一下引用文件。这里可以添加任意多个目录,IDE会从这些目录里寻找头文件
然后需要在Linker(链接器)里边添加glfw3.lib这个文件夹。然后还需要添加windows上的OpenGL库,在windows平台上它在vs安装的时候就默认安装了。只需要将opengl32.lib 添加进相同的位置就可以了。
最后要把cmake生成的glfw.c文件导入进项目。
如果这个时候引入头文件,#include <glfw3.h>没有报错,那就代表glfw配置成功了。
GLAD
因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询,所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。取得地址的方法因平台而异,类似这样:
// 定义函数原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正确的函数并赋值给函数指针
GL_GENBUFFERS glGenBuffers = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 现在函数可以被正常调用了
GLuint buffer; glGenBuffers(1, &buffer);
所以我们可以使用GLAD库来简化此过程。
GLAD是一个开源的库,它能解决我们上面提到的那个繁琐的问题。GLAD的配置与大多数的开源库有些许的不同,GLAD使用了一个在线服务。在这里我们能够告诉GLAD需要定义的OpenGL版本,并且根据这个版本加载所有相关的OpenGL函数。
打开GLAD的在线服务,将语言(Language)设置为C/C++,在API选项中,选择3.3以上的OpenGL(gl)版本(我们的教程中将使用3.3版本,但更新的版本也能用)。之后将模式(Profile)设置为Core,并且保证选中了生成加载器(Generate a loader)选项。现在可以先(暂时)忽略扩展(Extensions)中的内容。都选择完之后,点击生成(Generate)按钮来生成库文件。
GLAD现在应该提供给你了一个zip压缩文件,包含两个头文件目录,和一个glad.c文件。将两个头文件目录(glad和KHR)复制到你的Include文件夹中(或者增加一个额外的项目指向这些目录),并添加glad.c文件到你的工程中。
经过前面的这些步骤之后,你就应该可以将以下的指令加到你的文件顶部了:
#include <glad/glad.h>
OK,全部配置完成了。