Почему glm:: vec представляет значения vec как объединения?
Я искал реализацию исходного кода 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
?
Ответы
Ответ 1
Поскольку vec4
обычно используется для:
- Космические координаты
x
, y
, z
, w
- Цветовые компоненты
r
, g
, b
, a
- Координаты текстуры
s
, t
, p
, q
(хотя они менее стандартизованы, и я также видел r
и u
, используемые в разных контекстах)
Использование объединений позволяет использовать для доступа к, например, второй элемент данных как .y
или .g
, в зависимости от ваших предпочтений и семантики.
Ответ 2
GLM предназначен для того, чтобы вести себя как GLSL так же, как позволяет С++. В GLSL операции swizzle для векторов могут использовать xyzw
, rgba
или stpq
, с соответствующими именами элементов, ссылающимися на те же элементы вектора. Следовательно, объединение используется для соответствия этому поведению.