Почему 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, с соответствующими именами элементов, ссылающимися на те же элементы вектора. Следовательно, объединение используется для соответствия этому поведению.