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

老知识:OpenGL 的 glu这个库已被弃用,改用glm了

太久没有写底层代码,傻傻分不清glu和glm。今天查了一下,发现OpenGL 的 glu这个库已被弃用,不更新了。
OpenGL 的 GLU (OpenGL Utility Library) 已经被弃用多年,尤其是在现代 OpenGL 核心配置文件(Core Profile)中。以下是详细解释以及 GLM 成为主流替代方案的原因:


1. GLU 为何被弃用?

固定功能管线的淘汰:GLU 依赖于 OpenGL 的旧版固定功能管线(Fixed-Function Pipeline),例如 gluPerspectivegluLookAt 等函数,这些功能在现代 OpenGL 的可编程管线(Programmable Pipeline)中已不再直接支持。
依赖过时特性:GLU 的某些功能(如曲面细分 gluNurbsSurface、二次几何体 gluSphere)需要旧版矩阵堆栈和固定光照模型,而现代 OpenGL 已移除这些特性。
官方弃用:自 OpenGL 3.0(2008年)起,GLU 不再被维护,且未被纳入核心规范。主流驱动和操作系统逐渐停止支持。


2. GLM 的崛起

GLM (OpenGL Mathematics) 是一个轻量级的 C++ 数学库,专为 OpenGL 设计,完全兼容 GLSL(OpenGL Shading Language)的语法和功能。其优势包括:
现代数学支持:提供向量、矩阵、四元数等运算,完美适配可编程管线。
替代 GLU 功能:例如:
glm::perspective 替代 gluPerspective
glm::lookAt 替代 gluLookAt
跨平台和头文件库:无需编译,直接包含头文件即可使用。
活跃维护:持续更新支持最新 OpenGL 和 Vulkan 标准。


3. GLU vs. GLM 的用途对比

功能GLUGLM
矩阵操作依赖固定管线函数提供纯数学计算(如 glm::mat4
投影/视图矩阵gluPerspectivegluLookAtglm::perspectiveglm::lookAt
几何体生成gluSpheregluCylinder需手动实现或使用其他库(如 Assimp)
曲面细分gluNurbsSurface需用细分着色器或计算着色器

4. 现代 OpenGL 的替代方案

数学运算:优先使用 GLM,或选择其他库(如 Eigen)。
几何体生成:使用模型加载库(如 Assimp)或手动生成顶点数据。
高级功能:依赖着色器(Shader)实现,例如用细分着色器替代 gluNurbsSurface


5. 代码示例对比

GLU 旧代码(已过时):

glMatrixMode(GL_PROJECTION);
gluPerspective(45.0f, aspectRatio, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
gluLookAt(0,0,5, 0,0,0, 0,1,0);

GLM 现代代码

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>

glm::mat4 projection = glm::perspective(glm::radians(45.0f), aspectRatio, 0.1f, 100.0f);
glm::mat4 view = glm::lookAt(glm::vec3(0,0,5), glm::vec3(0,0,0), glm::vec3(0,1,0));
// 通过 Uniform 传递到着色器

总结

GLU 已过时,仅适合维护遗留代码;新项目应避免使用。
GLM 是现代 OpenGL/Vulkan 开发的事实标准数学库,建议优先采用。
• 学习资源应关注可编程管线和着色器编程(如 LearnOpenGL 等教程)。

如需处理旧项目中的 GLU 代码,可逐步替换为 GLM 或自定义数学实现。

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

相关文章:

  • 【Azure 架构师学习笔记】- Azure Networking(1) -- Service Endpoint 和 Private Endpoint
  • 操作系统的概念、功能和目标
  • 耘想Docker版Linux NAS的安装说明
  • 存算一体与存算分离:架构设计的深度解析与实现方案
  • Linux文件操作笔记
  • 手撕算法之`vector` 扩容、`string` 分割、链表翻转
  • 头歌实训--Pandas合并数据集--第1关:Concat与Append操作
  • vue使用element-ui自定义样式思路分享【实操】
  • freeswitch(在呼叫失败的情况下如何播放语⾳提⽰)
  • 【音视频开发】第三章 FFmpeg 命令实战
  • Java遍历魔法
  • 嵌入式笔记 | 正点原子STM32F103ZET6 3 | 时钟系统
  • 【MySQL】基本查询(第一弹)
  • P10045 [CCPC 2023 北京市赛] 线段树
  • docker部署dify
  • VNA操作使用学习-14 再测晶振特性
  • 发布第四代液晶电视,TCL引领全新美学境界
  • 理解 RAG 第四部分:RAGA 和其他评估框架
  • Android BLE 权限管理
  • 城市街拍人像自拍电影风格Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • 内网渗透(CSMSF) 构建内网代理的全面指南:Cobalt Strike 与 Metasploit Framework 深度解析
  • latex-二项式括号怎么敲?
  • Linux --centos安装显卡驱动
  • 【AI】AI编程助手:Cursor、Codeium、GitHub Copilot、Roo Cline、Tabnine
  • 零拷贝技术深度解析:原理、实现与性能革命
  • PWM控制电机转速的原理及相关寄存器值计算
  • 防窜货实时监控系统大屏:用python和Streamlit实现的防窜货大屏
  • 【算法学习】最小公倍数问题
  • HTML5前端第七章节
  • 【Go】结构体的基本使用