我正在查看vec4
glm的源代码实现,我想知道为什么它们用union表示向量值,而不是像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
,会有什么不同?
答案 0 :(得分:19)
因为vec4
通常用于:
x
,y
,z
,w
r
,g
,b
,a
s
,t
,p
,q
(尽管这些标准不太标准化,我也看到r
和{ {1}}在不同的情境中使用)使用联合允许使用访问例如第二个数据成员为u
或.y
,具体取决于您的偏好&语义。
答案 1 :(得分:16)
GLM的设计与GLSL一样,与C ++允许的一样。在GLSL中,向量的混合操作可以使用xyzw
,rgba
或stpq
,相应的元素名称引用向量的相同元素。因此,union用于匹配此行为。