Нужны некоторые разъяснения с понятием векторов в direct3D11
Сначала я подумал, что векторы - это просто массивы, которые могут хранить несколько значений одного типа. Но я думаю, что Direct3D использует другую терминологию, когда дело доходит до "векторов"
Скажем, например, мы создаем вектор с помощью функции XMVectorSet()
XMVECTOR myvector;
myvector = XMVectorSet(0.0f, 0.0f, -0.5f, 0.0f);
Что именно я хранил внутри myvector
? я просто сохранил массив значений с плавающей запятой?
3 ответа
В общем случае векторы в Direct3D представляют собой упорядоченную коллекцию из 2-4 элементов одного и того же типа с плавающей запятой или целого типа. Концептуально они похожи на массив, но больше похожи на структуру. Элементы обычно называются именами, такими как x
, y
, z
а также w
а не цифры. В зависимости от контекста вы можете использовать либо структуру C++, либо массив C++ для представления вектора Direct3D.
Однако тип XMVECTOR, в частности, представляет собой упорядоченную коллекцию из 4 элементов, которая одновременно содержит 32-разрядные и 32-разрядные целочисленные типы без знака. Каждый элемент имеет значение числа с плавающей запятой и целое число без знака, которые разделяют одно и то же машинное представление. Итак, используя ваш пример, переменная myvector
имеет одновременно вектор с плавающей запятой (0, 0, 0, 0, -0,5, 0, 0f) и целочисленный вектор без знака (0, 0, 0xbf000000, 0).
(Если мы используем обычную интерпретацию XYZW значения с плавающей точкой myvector
тогда он будет представлять вектор длиной 0,5, указывающий в направлении отрицательной оси Z. Если бы мы использовали необычную интерпретацию RGBA целочисленного значения без знака myvector
тогда это будет 100% прозрачный синий цвет.)
Какое значение будет использовано, зависит от функции, с которой используется объект XMVECTOR. Так, например, функция XMVectorAdd обрабатывает свои аргументы как два вектора с плавающей запятой, в то время как XMVectorAndInt обрабатывает аргумент как два целых вектора без знака. Большинство операций, которые могут быть предварительно выполнены с объектами XMVECTOR, используют значения с плавающей точкой. Целочисленные операнды без знака обычно используются для манипулирования битами в машинном представлении значений с плавающей запятой.
"Векторы" C++ действительно являются массивными хранилищами.
Вы правы в том, что Direct3D использует другое значение термина "векторы": их более глобальное математическое значение. Эти векторы являются величинами, которые имеют направление и размер.
Дальнейшее чтение:
XMVECTOR имеет неопределенную внутреннюю разметку:
В библиотеке DirectXMath для полной поддержки переносимости и оптимизации XMVECTOR по своей природе является непрозрачным типом. Фактическая реализация XMVECTOR зависит от платформы.
Таким образом, это может быть массив с четырьмя элементами или структура с элементами.x, .y, .z и.w. Или это может быть что-то совершенно другое.