为什么 glm::vec 将 vec 值表示为联合?
Why does glm::vec represent vec values as unions?
我正在查看 vec4
glm 的源代码实现,我想知道为什么它们用联合表示向量值,而不是像 float
或 int
这样的原始数据类型?
这是我在 vec4
实现中找到的代码:
union { T x, r, s; };
union { T y, g, t; };
union { T z, b, p; };
union { T w, a, q; };
只写T x
、T y
、T z
、T w
有什么区别?
因为 vec4
通常用于:
- Space坐标
x
,y
,z
,w
- 颜色分量
r
、g
、b
、a
- 纹理坐标
s
、t
、p
、q
(虽然这些不太标准化,我也看到了r
和u
用于不同的上下文)
使用联合允许使用访问例如第二个数据成员为 .y
或 .g
,具体取决于您的偏好和语义。
GLM 被设计成在 C++ 允许的范围内表现得像 GLSL。在 GLSL 中,向量的混合操作可以使用 xyzw
、rgba
或 stpq
,相应的元素名称引用向量的相同元素。所以用union来匹配这个行为。
我正在查看 vec4
glm 的源代码实现,我想知道为什么它们用联合表示向量值,而不是像 float
或 int
这样的原始数据类型?
这是我在 vec4
实现中找到的代码:
union { T x, r, s; };
union { T y, g, t; };
union { T z, b, p; };
union { T w, a, q; };
只写T x
、T y
、T z
、T w
有什么区别?
因为 vec4
通常用于:
- Space坐标
x
,y
,z
,w
- 颜色分量
r
、g
、b
、a
- 纹理坐标
s
、t
、p
、q
(虽然这些不太标准化,我也看到了r
和u
用于不同的上下文)
使用联合允许使用访问例如第二个数据成员为 .y
或 .g
,具体取决于您的偏好和语义。
GLM 被设计成在 C++ 允许的范围内表现得像 GLSL。在 GLSL 中,向量的混合操作可以使用 xyzw
、rgba
或 stpq
,相应的元素名称引用向量的相同元素。所以用union来匹配这个行为。