为什么 glm::vec 将 vec 值表示为联合?

Why does glm::vec represent vec values as unions?

我正在查看 vec4 glm 的源代码实现,我想知道为什么它们用联合表示向量值,而不是像 floatint 这样的原始数据类型?

这是我在 vec4 实现中找到的代码:

union { T x, r, s; };
union { T y, g, t; };
union { T z, b, p; };
union { T w, a, q; };

只写T xT yT zT w有什么区别?

因为 vec4 通常用于:

  • Space坐标x,y,z,w
  • 颜色分量 rgba
  • 纹理坐标stpq(虽然这些不太标准化,我也​​看到了ru 用于不同的上下文)

使用联合允许使用访问例如第二个数据成员为 .y.g,具体取决于您的偏好和语义。

GLM 被设计成在 C++ 允许的范围内表现得像 GLSL。在 GLSL 中,向量的混合操作可以使用 xyzwrgbastpq,相应的元素名称引用向量的相同元素。所以用union来匹配这个行为。