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

Другие вопросы по тегам