GLFW 学习笔记 (二)
Load 库
- 这几篇不会讲OpenGL和GLFW的原理性的东西,只是开发环境的建立。万事开头难,编程学习的开头就是开发环境,有了开发环境后,其他就可以自己摸索了。*
这一篇引入了GLAD这个加载库。
GLAD and GLEW
因为OpenGL只是一个标准,具体的实现是由驱动厂商来完成的,针对不同的显卡,有很多不同版本的OpenGL驱动,大多数函数的地址做不到一成不变,需要在运行的时候去查询。而具体的查询方法又是系统相关的,不同的操作系统,使用的方法也不一样,所以出现了很多load库来处理这些事情。
GLAD和GLEW就是其中的两个,其他的还有GL3W等。
下载GLAD
GLAD的官网提供了一个web service,作为一个开始,进行如下设置即可:
点击Generate
按钮生成配置文件,下载并解压后,有一个include
目录和一个src
目录。
实例代码和编译
创建一个文件夹作为项目目录,把上一步解压的glad的include 和src目录放到项目目录中。进入src
目录,里面有一个glad.c
文件,再创建一个main.cpp
文件,编辑main.cpp
,使用下面的示例代码:
|
现在无需深究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 学习笔记 (一)中相比,增加了-Iinclude
和src/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); |
并且在初始化的时候获取了这个函数的地址:
glad_glGetShaderiv = (PFNGLGETSHADERIVPROC)load("glGetShaderiv"); |
这样代码中就可以安全而方便的使用了。