Programming/컴퓨터그래픽스 (DX 11)

[DirectX 11] DirectXMath vs SimpleMath 어떤 자료형을 사용해야할까?

양양줘 2025. 9. 15. 20:53

DirectX 3D의 벡터와

매트릭스 관련 자료형들을 처음 접하면

뭐가 뭐지..? 왤케 많지...?

왜 호환이 안되지..????

하는 물음표들이 우다다 생길 것이다.

(내가 그랬다….)

 

그래서 각 자료형이 왜 이렇게 나뉘어져 있는건지,

어떤식으로 군집이 이루어져 있는지 정리하였다.

 

DirectXMath 라이브러리와 SimpleMath 라이브러리


먼저 벡터나 매트릭스나 표현하는 방식이 모두 3가지씩 있다. 예를들어 벡터는 Vector3, XMVECTOR, SMFLOAT3 이렇게 3가지의 자료형이 있고 모두 사용 방식이 다르다. 이는 제공 라이브러리에 차이가 있는 것이며 크게 <SimpleMath>, <DirectXMath>라이브러리로 분리된다.

구분 용도 자료형
DirectXMath
(상수버퍼용)
상수버퍼 전송 저장용 자료형이다. 연산 기능을 제공하지 않는다. XMFLOAT3, XMFLOAT4,
XMFLOAT4X4
DirectXMath
(연산용)
연산용 자료형으로 SIMD 기반의 빠른 연산을 제공한다. 다만 연산자 오버로딩이 없고 함수 기반으로 연산한다.(XMVector3Transform) XMVECTOR, XMMATRIX
SimpleMath 연산용 자료형으로 DirectXMath 기반 wrapper이다. +,-,*,Transform 등 멤버 함수 제공하고 가장 직관적이라 CPU에서의 연산은 보통 SimpleMath의 자료형으로 구현하면 된다. Vector3, Vector4, Matrix

 

쉽게 이해하자면 DirectXMath 라이브러리의 자료형들은 연산이 빠르고 본인들간의 호환이 잘 되지만, 코드가 복잡하다는 단점이 있다. DirectX Tutorial 같은 곳에서는 모두 이 라이브러리를 사용하고 있다. SimpleMath 라이브러리는 내부적으로 DirectXMath를 감싸서 사용하기 편하게 구현되었다. 하지만 매핑 클래스이기 때문에 연산 성능은 DirectXMath보다 떨어진다. 그럼에도 불구하고 코드가 굉장히 깔끔하기 때문에 CPU 연산시에 Simple Math를 많이 사용 한다.

 

어떠한 자료형을 쓰건 쉐이더 코드(HLSL)의 자료형과 호환이 되어야 한다. 특히 상수 버퍼에 전달하는 행렬의 경우 자료형을 맞췄다고 끝이 아니라 전치행렬로 Transpose()해주는 것을 잊으면 안된다!

 

HLSL 자료형
HLSL 자료형 의미 크기 C++ 대응 자료형
float 32비트 실수 4B float
float2 2D 벡터 8B XMFLOAT2 / XMVECTOR / Vector2
float3 3D 벡터 12B XMFLOAT3 / XMVECTOR / Vector3
float4 4D 벡터 / RGBA 16B XMFLOAT4 / XMVECTOR / Vector4
float3x3 3x3 행렬 36B XMFLOAT3X3 / XMMATRIX(부분 사용) / Matrix(
float4x4 4x4 행렬 64B XMFLOAT4X4 / XMMATRIX / Matrix

 

 

그럼 어떤 자료형을 사용해야할까?

 

기본적으로 SimpleMath의 직관적인 자료형들을 사용하고, udpate나 render에서 반복적으로 일어나는 무거운 연산 작업에 대해서는 DirectXMath의 자료형과 함수를 사용해주는것이 좋을 것 같다는 판단이다!