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