GLFW 学习笔记 (二)

Load 库

  • 这几篇不会讲OpenGL和GLFW的原理性的东西,只是开发环境的建立。万事开头难,编程学习的开头就是开发环境,有了开发环境后,其他就可以自己摸索了。*

这一篇引入了GLAD这个加载库。

GLAD and GLEW

因为OpenGL只是一个标准,具体的实现是由驱动厂商来完成的,针对不同的显卡,有很多不同版本的OpenGL驱动,大多数函数的地址做不到一成不变,需要在运行的时候去查询。而具体的查询方法又是系统相关的,不同的操作系统,使用的方法也不一样,所以出现了很多load库来处理这些事情。

GLAD和GLEW就是其中的两个,其他的还有GL3W等。

下载GLAD

GLAD的官网提供了一个web service,作为一个开始,进行如下设置即可:

glad_settings.png

点击Generate按钮生成配置文件,下载并解压后,有一个include目录和一个src目录。

实例代码和编译

创建一个文件夹作为项目目录,把上一步解压的glad的include 和src目录放到项目目录中。进入src目录,里面有一个glad.c文件,再创建一个main.cpp文件,编辑main.cpp,使用下面的示例代码:

#include <glad/glad.h>
#include <GLFW/glfw3.h>

int main()
{
glfwInit();

GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL) {
glfwTerminate();
return -1;
}

glfwMakeContextCurrent(window);

if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
return -1;
}

while (!glfwWindowShouldClose(window))
{
glfwSwapBuffers(window);
glfwPollEvents();
}

glfwTerminate();
return 0;
}

现在无需深究API的含义,但是要注意#include <glad/glad.h>需要放在#include <GLFW/glfw3.h>前面

在命令行进入项目根目录,输入编译命令:

cc $(pkg-config --cflags glfw3 gl) -Iinclude -o test src/main.cpp src/glad.c $(pkg-config --static --libs glfw3 gl)

可能会疑惑pkg-config的作用,其实没什么特别的,也就是查询各个库编译和链接需要的参数。比如我的系统下:

$ pkg-config --cflags --static --libs glfw3 gl

输出为-lglfw -lrt -lm -ldl -lGL

GLFW 学习笔记 (一)中相比,增加了-Iincludesrc/glad.c,前者表示增加include的搜索路径为当前目录下的include文件夹,后者表示编译的时候需要一起编译src/glad.c文件,这些都是 gcc/g++ 的参数。

由此可见,glad的依赖关系还是相当简单的,了解了这些,再用cmake等工具生成编译配置心里就比较有数了。

glad 的作用s

上面的代码,我们只使用到了一个glad的函数:

gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)

如果把include <glad/glad.h> 和上面的代码注释掉,一样可以正常编译,正常运行,看不出有什么用处,但是如果按照LearnOpenGL - Hello Triangle教程学下去,会发现很多函数,比如glGetShaderiv会提示找不到。

glad的作用,就是在头文件中声明了这个函数:

typedef void (APIENTRYP PFNGLGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint *params);
GLAPI PFNGLGETSHADERIVPROC glad_glGetShaderiv;
#define glGetShaderiv glad_glGetShaderiv

并且在初始化的时候获取了这个函数的地址:

glad_glGetShaderiv = (PFNGLGETSHADERIVPROC)load("glGetShaderiv");

这样代码中就可以安全而方便的使用了。

参考:

LearnOpenGL - Creating a window