OpenGL——GLM数学库(Ps:平安夜快乐🍎,圣诞快乐🎄)

还没有找到很好的中文教程类资源啥的,那就直接自己看官方手册吧,,(・_・;

既然决定了写一篇GLM的博客就想写全一点,不然有点难受,害,,真麻烦,好多东西其实估计我用不上。不过其实很多都没有展开讲,只是暂且先知道了有这么一个东西,这样要用的时候查就会有概念一些方便找头文件是啥0.0


0 GLM介绍

GLM库的官网:https://glm.g-truc.net/0.9.9/index.html(似乎是需要快乐上网的)

github地址:https://github.com/g-truc/glm

官方手册:https://github.com/g-truc/glm/blob/master/manual.md

OpenGL没有自己内置的数学库,所以有了OpenGL Mathematics(GLM),基于OpenGL Shading Language(GLSL)规范的图形软件的数学库

支持以下编译器:

接下来就进正题:D

1 入门

总结起来头文件其实就两个,一个是核心实现,还有一个ext是一些扩展,直接用这两个头文件显然很方便,但是这样要导入太多东西会浪费编译时间,所以没有必要,更多的时候是要啥导入具体的那个

1
2
3
4
5
// Include all GLM core / GLSL features
#include <glm/glm.hpp> // vec2, vec3, mat4, radians

// Include all GLM extensions
#include <glm/ext.hpp> // perspective, translate, rotate

下面就是glm里具体的,有啥数据类型大概可以看这些名字猜一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <glm/vec2.hpp>               // vec2, bvec2, dvec2, ivec2 and uvec2
#include <glm/vec3.hpp> // vec3, bvec3, dvec3, ivec3 and uvec3
#include <glm/vec4.hpp> // vec4, bvec4, dvec4, ivec4 and uvec4
#include <glm/mat2x2.hpp> // mat2, dmat2
#include <glm/mat2x3.hpp> // mat2x3, dmat2x3
#include <glm/mat2x4.hpp> // mat2x4, dmat2x4
#include <glm/mat3x2.hpp> // mat3x2, dmat3x2
#include <glm/mat3x3.hpp> // mat3, dmat3
#include <glm/mat3x4.hpp> // mat3x4, dmat2
#include <glm/mat4x2.hpp> // mat4x2, dmat4x2
#include <glm/mat4x3.hpp> // mat4x3, dmat4x3
#include <glm/mat4x4.hpp> // mat4, dmat4
#include <glm/common.hpp> // all the GLSL common functions: abs, min, mix, isnan, fma, etc.
#include <glm/exponential.hpp> // all the GLSL exponential functions: pow, log, exp2, sqrt, etc.
#include <glm/geometry.hpp> // all the GLSL geometry functions: dot, cross, reflect, normalize, etc.
//上面这个我在实际用的时候(0.9.9.7)发现应该是#include <glm/geometric.hpp>
#include <glm/integer.hpp> // all the GLSL integer functions: findMSB, bitfieldExtract, etc.
#include <glm/matrix.hpp> // all the GLSL matrix functions: transpose, inverse, etc.
#include <glm/packing.hpp> // all the GLSL packing functions: packUnorm4x8, unpackHalf2x16, etc.
#include <glm/trigonometric.hpp> // all the GLSL trigonometric functions: radians, cos, asin, etc.
#include <glm/vector_relational.hpp> // all the GLSL vector relational functions: equal, less, etc.

2 预处理器配置

这节讲的东西大概是可以用一些固定的宏定义来更改GLM配置,简述如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
GLM_FORCE_MESSAGES: 平台自动检测和默认配置
GLM_FORCE_PLATFORM_UNKNOWN: 强制GLM不检测构建平台
GLM_FORCE_COMPILER_UNKNOWN: 强制GLM不检测C++编译器
GLM_FORCE_ARCH_UNKNOWN: 强制GLM不检测构建体系结构
GLM_FORCE_CXX_UNKNOWN: 强制GLM不检测C++标准
GLM_FORCE_CXX**: C++语言检测detectionGLM_FORCE_EXPLICIT_CTOR: 需要显式转换
GLM_FORCE_INLINE: 强制内联
GLM_FORCE_ALIGNED_GENTYPES: 强制GLM启用对齐类型
GLM_FORCE_DEFAULT_ALIGNED_GENTYPES: 强制GLM默认使用对齐类型
GLM_FORCE_INTRINSICS: 使用SIMD优化optimizationsGLM_FORCE_PRECISION_**: 默认精度
GLM_FORCE_SINGLE_ONLY: 删除了显式的64位浮点类型
GLM_FORCE_SWIZZLE: 启用Swizzle运算符
GLM_FORCE_XYZW_ONLY: 仅公开x,y,z和w分量
GLM_FORCE_LEFT_HANDED: 强制左手坐标系
GLM_FORCE_DEPTH_ZERO_TO_ONE: 强制使用0到1之间的剪辑空间
GLM_FORCE_SIZE_T_LENGTH: 向量和矩阵的静态大小
GLM_FORCE_UNRESTRICTED_GENTYPE: 删除genType限制
GLM_FORCE_SILENT_WARNINGS: 来自语言扩展的静默C++警告

3 Stable extensions

3.1 标量类型

1
2
GLM_EXT_scalar_int_sized:sized and signed integer types
GLM_EXT_scalar_uint_sized:sized and unsigned integer types

3.2 标量函数

1
2
3
4
GLM_EXT_scalar_common:min/max/fmin/fmax
GLM_EXT_scalar_relational:等于equal/不等于notEqual
GLM_EXT_scalar_constants:一些常量,比如epsilon/pi
GLM_EXT_scalar_ulp:数值计算中的准确性度量

3.3 向量类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
GLM_EXT_vector_float1:float型的一维向量
GLM_EXT_vector_float2:float型的二维向量
GLM_EXT_vector_float3
GLM_EXT_vector_float4
GLM_EXT_vector_double1:double型的一维向量
GLM_EXT_vector_double2
GLM_EXT_vector_double3
GLM_EXT_vector_double4
GLM_EXT_vector_int1:int型的一维向量
GLM_EXT_vector_int2
GLM_EXT_vector_int3
GLM_EXT_vector_int4
GLM_EXT_vector_uint1:uint型的一维向量
GLM_EXT_vector_uint2
GLM_EXT_vector_uint3
GLM_EXT_vector_uint4
GLM_EXT_vector_bool1:bool型的一维向量
GLM_EXT_vector_bool2
GLM_EXT_vector_bool3
GLM_EXT_vector_bool4

3.4 具有精度限定词的向量类型

1
2
3
4
5
6
7
8
GLM_EXT_vector_float1_precision
GLM_EXT_vector_float2_precision
GLM_EXT_vector_float3_precision
GLM_EXT_vector_float4_precision
GLM_EXT_vector_double1_precision
GLM_EXT_vector_double2_precision
GLM_EXT_vector_double3_precision
GLM_EXT_vector_double4_precision

3.5 向量函数

1
2
3
GLM_EXT_vector_common:min/max/fmin/fmax
GLM_EXT_vector_relational:等于equal/不等于notEqual
GLM_EXT_vector_ulp:数值计算中的准确性度量

3.6 矩阵类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
GLM_EXT_matrix_float2x2
GLM_EXT_matrix_float2x3
GLM_EXT_matrix_float2x4
GLM_EXT_matrix_float3x2
GLM_EXT_matrix_float3x3
GLM_EXT_matrix_float3x4
GLM_EXT_matrix_float4x2
GLM_EXT_matrix_float4x3
GLM_EXT_matrix_float4x4
GLM_EXT_matrix_double2x2
GLM_EXT_matrix_double2x3
GLM_EXT_matrix_double2x4
GLM_EXT_matrix_double3x2
GLM_EXT_matrix_double3x3
GLM_EXT_matrix_double3x4
GLM_EXT_matrix_double4x2
GLM_EXT_matrix_double4x3
GLM_EXT_matrix_double4x4

3.7 具有精确限定符的矩阵类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
GLM_EXT_matrix_float2x2_precision
GLM_EXT_matrix_float2x3_precision
GLM_EXT_matrix_float2x4_precision
GLM_EXT_matrix_float3x2_precision
GLM_EXT_matrix_float3x3_precision
GLM_EXT_matrix_float3x4_precision
GLM_EXT_matrix_float4x2_precision
GLM_EXT_matrix_float4x3_precision
GLM_EXT_matrix_float4x4_precision
GLM_EXT_matrix_double2x2_precision
GLM_EXT_matrix_double2x3_precision
GLM_EXT_matrix_double2x4_precision
GLM_EXT_matrix_double3x2_precision
GLM_EXT_matrix_double3x3_precision
GLM_EXT_matrix_double3x4_precision
GLM_EXT_matrix_double4x2_precision
GLM_EXT_matrix_double4x3_precision
GLM_EXT_matrix_double4x4_precision

3.8 矩阵函数

1
2
3
4
GLM_EXT_matrix_relational:等于equal/不等于notEqual
GLM_EXT_matrix_transform:平移translate/旋转rotate/缩放scale
GLM_EXT_matrix_clip_space:将场景转换为clip space
GLM_EXT_matrix_projection:将对象坐标映射到窗口坐标并反转

3.9 四元数

1
2
GLM_EXT_quaternion_float
GLM_EXT_quaternion_double

3.10 带精度限定符的四元数

1
2
GLM_EXT_quaternion_float_precision
GLM_EXT_quaternion_double_precision

3.11 四元数函数

1
2
3
4
5
6
GLM_EXT_quaternion_common:球面线性插值slerp/共轭conjugate/求逆inverse
GLM_EXT_quaternion_geometric:length/normalize/dot/cross
GLM_EXT_quaternion_trigonometric:角度angle/轴线axis
GLM_EXT_quaternion_exponential:exp/log/pow/sqrt
GLM_EXT_quaternion_relational:比较四元数
GLM_EXT_quaternion_transform:转换对象

4 Recommended extensions

GLM通过扩展来扩展核心GLSL功能集。这些扩展包括:四元数,变换,样条,矩阵逆,色彩空间等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
GLM_GTC_bitfield:标量和向量变量的快速位运算
GLM_GTC_color_space:线性RGB和sRGB色彩空间之间的转换
GLM_GTC_constants:提供内置常量列表
GLM_GTC_epsilon:浮点数的近似相等比较
GLM_GTC_integer:GLM核心函数的整数变体
GLM_GTC_matrix_access:方便访问矩阵的各个行或列的函数
GLM_GTC_matrix_integer:整数矩阵类型,不支持某些运算(例如逆和行列式)
GLM_GTC_matrix_inverse:矩阵求逆函数
GLM_GTC_matrix_transform:遵循OpenGL固定功能的矩阵转换函数
GLM_GTC_noise:定义2D,3D和4D程序噪声函数
GLM_GTC_packing:将标量和向量类型与打包格式之间进行转换,以节省精度为代价来节省空间(也可以打包成解压缩的格式保证无损)
GLM_GTC_quaternion:四元数及其上的运算
GLM_GTC_random:概率分布(最多四个维度)
GLM_GTC_reciprocal:倒数三角函数,比如secant/cosecant/tangent
GLM_GTC_round:舍入运算
GLM_GTC_type_aligned:对齐的向量类型
GLM_GTC_type_precision:有定义精度的向量和矩阵类型,比如i8vec4是带符号的8位整数的4维向量
GLM_GTC_type_ptr:基本类型和GLM类型的指针之间的交互
GLM_GTC_ulp:测量函数的准确性
GLM_GTC_vec1:一维向量指针

5 OpenGL interoperability

5.1 不建议使用的OpenGL函数的GLM替代

1
2
3
4
5
6
7
8
9
glRotate{f, d}:
glScale{f, d}:
glTranslate{f, d}:
glLoadIdentity:
glMultMatrix{f, d}:
glLoadTransposeMatrix{f, d}:
glMultTransposeMatrix{f, d}:
glFrustum:
glOrtho:

5.2 GLM替代GLU函数

1
2
3
4
5
6
gluLookAt:
gluOrtho2D:
gluPerspective:
gluPickMatrix:
gluProject:
gluUnProject:

6 其他记录

  • 绝对不要用using namespace glm;
  • glm可以针对其实现的功能自动生成SIMD优化的代码
  • 某些GLM功能会因除零而崩溃,但这是域错误导致的,比如将空向量glm::normalize函数或将负数传递给std::sqrt
  • glm是弧度制

手册的最后还给出了一些使用glm的项目,真是五花八门五彩缤纷五颜六色啊

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2018-2020 LeFlacon

奶茶一杯 快乐起飞

支付宝
微信