Странные значения XMVECTOR

#c #vector #graphics #directx #directx-12

#c #вектор #графика #directx #directx-12

Вопрос:

Начинаю с DirectX и путаюсь с XMVECTORs

(Я знаю, что не использую их в контексте, мне просто любопытно)

 // Vectors.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

#include <DirectXMath.h>
#include <DirectXPackedVector.h>


int main()
{
    using namespace DirectX;

    XMVECTOR vector = XMVectorSet(1, 2, 3, 1);

    int x = XMVectorGetIntX(vector);

    std::cout << "vector.x: " << x << std::endl;

    system("pause");

    return 0;
}
  

При этом выводится значение 1065353216

Хотя это и интересно, мне интересно, что я делаю не так, или это действительно предполагаемая функциональность.

Комментарии:

1. Вам следует использовать XMVectorSetInt , если вы хотите хранить целочисленные данные.

2. 1065353216 0x3F800000 в шестнадцатеричном формате, каково представление IEEE754 1.0f.

3. А, понятно! Итак, каково предполагаемое использование XMVectorSet тогда?

4. Все, что не имеет суффикса *Int, предназначено для данных с плавающей запятой.

Ответ №1:

Базовые инструкции SIMD не имеют типов. Вы можете обрабатывать одни и те же данные как 4 числа с плавающей запятой или как 4 целых числа (или 8 коротких значений, или 16 байт). DirectXMath обычно работает с 4 числами с плавающей точкой, которые вы XMVECTOR получаете от XMVectorSet .

Если бы вы использовали float x = XMVectorGetX(vector); , вы бы получили «1.0» обратно.

В качестве альтернативы, вы могли бы использовать XMVECTOR vector = XMVectorSetInt(1, 2, 3, 1);

Смотрите Руководство программиста по DirectXMath, а также проект GitHub.