#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.