老知识:OpenGL 的 glu这个库已被弃用,改用glm了
太久没有写底层代码,傻傻分不清glu和glm。今天查了一下,发现OpenGL 的 glu这个库已被弃用,不更新了。
OpenGL 的 GLU (OpenGL Utility Library) 已经被弃用多年,尤其是在现代 OpenGL 核心配置文件(Core Profile)中。以下是详细解释以及 GLM 成为主流替代方案的原因:
1. GLU 为何被弃用?
• 固定功能管线的淘汰:GLU 依赖于 OpenGL 的旧版固定功能管线(Fixed-Function Pipeline),例如 gluPerspective
、gluLookAt
等函数,这些功能在现代 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 的用途对比
功能 | GLU | GLM |
---|---|---|
矩阵操作 | 依赖固定管线函数 | 提供纯数学计算(如 glm::mat4 ) |
投影/视图矩阵 | gluPerspective 、gluLookAt | glm::perspective 、glm::lookAt |
几何体生成 | gluSphere 、gluCylinder | 需手动实现或使用其他库(如 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 或自定义数学实现。