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

pur*_*ure 14 c++ glm-math

我在看vec4glm的源代码实现,我想知道为什么它们用union表示向量值,而不是像float或等原始数据类型int

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

union { T x, r, s; };
union { T y, g, t; };
union { T z, b, p; };
union { T w, a, q; };
Run Code Online (Sandbox Code Playgroud)

是什么,如果我们只是写的区别T x,T y,T z,T w

Rei*_*ica 19

因为a vec4常用于:

  • 空间坐标x,y,z,w
  • 颜色分量r,g,b,a
  • 纹理坐标s,t,p,q(虽然这些不太规范,我也看到了ru在不同环境下使用)

利用工会允许用于访问如第二数据成员的任一.y或者.g,根据自己的喜好和语义.

  • @NicolBolas C++ 11标准中的语言是"在一个联合中,最多一个非静态数据成员可以随时处于活动状态,即至多一个非静态数据成员的值可以随时存储在一个联合中,"所以从表面上看,答案似乎不是.这就是我问的原因.然而霍布斯的答案令人信服. (2认同)
  • @ chbaker0你引用的那段话的其余部分解释了为什么你可以像他们那样使用联合.假设`T`是标准布局类型(所有基元都是),那么你可以从它们的公共部分访问数据(因为它们都是相同的类型,是整个值) (2认同)

Nic*_*las 16

GLM的设计与GLSL一样,就像C++允许的那样.在GLSL中,向量的混合操作可以使用xyzw,rgba或者stpq使用引用向量的相同元素的相应元素名称.因此,union用于匹配此行为.

  • 加上一个突出与GLSL的兼容性,我没有考虑过. (2认同)