Требуется некоторое разъяснение концепции векторов в direct3D11.

Сначала я подумал, что векторы — это просто массивы, которые могут хранить несколько значений одного типа. Но я думаю, что direct3d использует другую терминологию, когда речь идет о «векторах».

Скажем, например, мы создаем вектор с помощью функции XMVectorSet()

XMVECTOR myvector;

myvector = XMVectorSet(0.0f, 0.0f, -0.5f, 0.0f);

Что именно я хранил внутри myvector? я только что сохранил массив значений с плавающей запятой?


person Soon_to_be_code_master    schedule 19.07.2015    source источник
comment
В математике/физике вектор — это последовательность координат, указывающая положение или направление. C++ взял идею вектора через std::vector и просто сделал из нее ряд вещей.   -  person TheUndeadFish    schedule 19.07.2015
comment
Поскольку вы, кажется, новичок в DirectXMath, вы можете начать с SimpleMath оболочка в Набор инструментов DirectX.   -  person Chuck Walbourn    schedule 19.07.2015
comment
XMVECTOR не имеет ничего общего с std::vector. Я понимаю, что это всего лишь пример вопроса о том, что здесь произошло, но на самом деле «эффективным» способом присвоения статического набора чисел XMVECTOR было бы сделать: static const XMVECTORF32 s_value = { 0.f, 0.f, -0.5f, 0.f }; myvector = s_value   -  person Chuck Walbourn    schedule 19.07.2015


Ответы (3)


«Векторы» С++ действительно являются контейнерами хранения, подобными массивам.

Вы правы в том, что Direct3D использует другое значение термина «векторы»: их более глобальное математическое значение. Эти векторы представляют собой величины, которые имеют направление и размер.

Дальнейшее чтение:

person Lightness Races in Orbit    schedule 19.07.2015

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

person Ross Ridge    schedule 19.07.2015