Обычно векторы в 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
std::vector
и просто сделал из нее ряд вещей. - person TheUndeadFish   schedule 19.07.2015XMVECTOR
не имеет ничего общего с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.2015XMVECTOR
иXMMATRIX
не как о переменных, а как о регистрах SIMD. Код в вашем вопросе просто перемещает 4 константы с плавающей запятой в 4 слота регистра SIMD. - person Chuck Walbourn   schedule 19.07.2015