当前位置: 首页 > news >正文

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 窗口中显示结果。

http://www.dtcms.com/a/344223.html

相关文章:

  • 轮廓检测技术不仅能精确计算图像中的轮廓数量,还能完整记录每个轮廓包含的所有像素点坐标
  • Linux服务测试
  • Jenkins用户授权管理 企业级jenkins授权策略 jenkins用户权限分配
  • Flutter InheritedWidget 详解
  • 学习嵌入式的第二十四天——数据结构——队列和树
  • Flutter 从入门到精通 - 完整课程总结
  • 打印机怎么连接电脑?打印机驱动?【图文详解】USB连接打印机?wifi连接打印机?
  • ZKmall模块商城的跨境电商支付安全方案:加密与权限的双重防护
  • STL关联式容器解析:map与set详解
  • 电脑芯片大的32位与64位指的是什么
  • 94. 城市间货物运输 I, Bellman_ford 算法
  • 解读商业智能BI,数据仓库中的元数据
  • Python训练营打卡Day40-简单CNN
  • memcmp 函数的使用及其模拟实现
  • io.github.lucksiege:pictureselector状态栏没沉浸问题
  • 十大麦克风品牌排行榜,顶级麦克风品牌排行榜,麦克风品牌排行榜
  • 同济北化工联手AM:800 ℃/20 s磁感应闪焊合金负极,金属电池枝晶终结者
  • 一洽客服系统:自定义渠道启用路由和样式设置
  • 【自用】Maven常用依赖
  • AI知识管理全面指南:助力企业高效协作与创新
  • 【STM32】CubeMX(十一):FreeRTOS任务挂起与解挂
  • 汽车行业AI视觉检测方案(四):管控发动机外观缺陷
  • 【网卡配置编辑器】快捷的编辑网卡配置,便于调试网络设备
  • DOLO 上涨:Berachain 生态爆发的前奏?
  • 怎么用pytorch训练一个模型,并跑起来
  • More Effective C++ 条款02:最好使用C++转型操作符
  • JMeter 安装教程:轻松开启性能测试之旅
  • 前后端分离项目(Web篇)
  • BlockingQueue 是什么?
  • MySQL连接原理深度解析:从算法到源码的全链路优化