C++ OpenGL中几个常见库及其区别
以前有段时间边学习边记录OpenGL开发知识,中间项目事情耽误了,现在又有时间继续学习OpenGL。主要想达成的目的是想基于国产化平台开发一个便于移植的浏览GIS影像的轻量化软件,但是对于其中有几个常见的库,总是搞不懂有啥区别和联系。通过豆包中的解释基本搞清楚了,便于以后查阅,特此记录
下面分别介绍:glfw、glad、GLEW 、glm
以前学习笔记:
C++ OpenGL学习笔记(1、Hello World空窗口程序)
C++ OpenGL学习笔记(2、绘制橙色三角形绘制、绿色随时间变化的三角形绘制)
C++ OpenGL学习笔记(3、绘制彩色三角形、绘制彩色矩形)
C++ OpenGL学习笔记(4、绘制贴图纹理)
目录
- 1、glfw(窗口和输入管理库)
- 1.1、典型用途:
- 2、glad(OpenGL 函数加载库)
- 2.1、典型用途
- 3、GLEW (老版本glad )
- 3.1、GLEW 的核心作用
- 3.2、GLEW 的主要功能就是:
- 3.3、GLEW 与其他库的关系
- 3.4、典型用途
- 3.5、现状与选择建议
- 4、glm(数学库)
- 4.1、典型用途
- 总结:四者的协作关系
1、glfw(窗口和输入管理库)
核心功能:负责创建和管理 OpenGL 上下文、窗口,以及处理键盘、鼠标等输入事件。
解决的问题:
OpenGL 本身不提供窗口创建和输入处理功能(它仅关注图形渲染),需要依赖操作系统的窗口系统(如 Windows 的 Win32、Linux 的 X11 等)。
GLFW 封装了不同操作系统的底层窗口接口,提供跨平台(Windows/macOS/Linux)的统一 API,让开发者无需关注操作系统差异。
1.1、典型用途:
// 初始化GLFW
glfwInit();
// 创建窗口和OpenGL上下文
GLFWwindow* window = glfwCreateWindow(800, 600, "窗口标题", NULL, NULL);
// 事件循环(处理输入、窗口关闭等)
while (!glfwWindowShouldClose(window)) {glfwPollEvents(); // 处理输入事件// 渲染逻辑...glfwSwapBuffers(window); // 交换前后缓冲区
}
2、glad(OpenGL 函数加载库)
核心功能:自动加载 OpenGL 函数指针,让程序能调用 OpenGL 的底层接口。
解决的问题:
OpenGL 是一个规范,具体实现由显卡驱动提供,且函数地址在运行时才确定(而非编译时)。
不同操作系统、显卡驱动对 OpenGL 函数的导出方式不同,直接调用会导致编译或运行错误。
GLAD 会根据你指定的 OpenGL 版本和扩展,生成对应的函数加载代码,自动获取函数地址。
2.1、典型用途
// 初始化GLAD(需传入GLFW的函数指针获取函数)
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {// 加载失败处理
}
// 之后即可直接调用OpenGL函数
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); // 设置清屏颜色
glClear(GL_COLOR_BUFFER_BIT); // 清屏
3、GLEW (老版本glad )
GLEW与glad 类似,但出现时间更早,是早期 OpenGL 开发中广泛使用的工具
3.1、GLEW 的核心作用
OpenGL 标准仅定义了接口规范,具体实现由显卡驱动提供。由于:
OpenGL 的函数地址运行时动态链接(而非编译时静态链接),程序需要在运行时获取函数地址才能调用;
不同显卡支持的 OpenGL 版本(如 3.3、4.6)和扩展(如 GL_ARB_texture_compression)差异很大,需要动态检测和加载支持的函数。
3.2、GLEW 的主要功能就是:
自动检测当前系统支持的 OpenGL 核心函数和扩展函数;
动态加载这些函数的地址,让开发者可以直接调用(无需手动处理跨平台、跨驱动的函数地址获取逻辑)。
3.3、GLEW 与其他库的关系
与 GLFW:两者互补。GLFW 负责窗口创建和输入管理,GLEW 负责 OpenGL 函数加载,通常一起使用。
与 GLAD:两者功能重叠(都是函数加载库),但 GLAD 是较新的替代方案,支持更灵活的 OpenGL 版本配置(可精确指定需要加载的核心功能和扩展),而 GLEW 对较新的 OpenGL 版本(如 4.5+)支持不如 GLAD 及时。
与 GLM:无直接关联,GLM 是数学库,GLEW 是函数加载库,可配合使用。
3.4、典型用途
#include <GL/glew.h> // 必须在GLFW之前包含
#include <GLFW/glfw3.h>int main() {// 1. 初始化GLFW并创建窗口(略)glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "GLEW Example", NULL, NULL);glfwMakeContextCurrent(window);// 2. 初始化GLEW(关键步骤)if (glewInit() != GLEW_OK) {// 初始化失败处理return -1;}// 3. 之后即可直接调用OpenGL函数(由GLEW加载完成)glClearColor(0.2f, 0.3f, 0.3f, 1.0f);// ... 其他渲染逻辑
}
3.5、现状与选择建议
GLEW 曾是 OpenGL 开发的标配,但随着 GLAD 的出现,其使用率逐渐下降。
选择建议:
新项目优先使用 GLAD(更轻量、配置更灵活,对新 OpenGL 版本支持更好);
维护旧项目或依赖 GLEW 的第三方库时,仍需使用 GLEW。
无论使用 GLEW 还是 GLAD,核心目的都是解决 OpenGL 函数的跨平台动态加载问题,让开发者能专注于渲染逻辑而非底层接口细节。
4、glm(数学库)
核心功能:提供 OpenGL 开发中常用的数学运算(向量、矩阵、变换等),语法设计贴合 OpenGL 的坐标系统和着色器语言(GLSL)。
解决的问题:
3D 渲染依赖大量数学运算(如矩阵乘法、向量变换、透视投影等),手动实现容易出错且跨平台兼容性差。
GLM 的数据结构(如 glm::vec3 向量、glm::mat4 矩阵)可直接与 OpenGL 着色器交互(内存布局一致)。
4.1、典型用途
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>// 创建一个3D向量
glm::vec3 position(0.0f, 0.0f, 5.0f);
// 创建透视投影矩阵(符合OpenGL的右手坐标系)
glm::mat4 projection = glm::perspective(glm::radians(45.0f), // 视野角度800.0f / 600.0f, // 宽高比0.1f, 100.0f // 近/远平面
);
// 传递矩阵到着色器(可直接通过指针访问内存)
glUniformMatrix4fv(matrixLoc, 1, GL_FALSE, &projection[0][0]);
总结:四者的协作关系
GLFW:搭建舞台(创建窗口、管理输入),是程序运行的基础环境。
GLAD:接通电源(加载 OpenGL 函数),让程序能调用 OpenGL 的渲染功能。
GLEW:接通电源(加载 OpenGL 函数),老版本的GLAD;
GLM:提供工具(数学运算),简化 3D 空间变换等核心计算。
一个典型的 OpenGL 程序流程是:
用 GLFW 创建窗口和 OpenGL 上下文
用 GLAD 加载 OpenGL 函数
用 GLM 计算坐标变换矩阵
调用 OpenGL 函数(通过 GLAD)执行渲染,最终在 GLFW 窗口中显示结果。