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의 자료형과 함수를 사용해주는것이 좋을 것 같다는 판단이다!
'Programming > 컴퓨터그래픽스 (DX 11)' 카테고리의 다른 글
| MipMapping과 LOD(Level of Detail) (0) | 2025.09.17 |
|---|---|
| [DirectX 11] 상수버퍼(Constant Buffer) CPU 구조체와 HLSL 구조체 정렬 맞추기 (0) | 2025.09.16 |
| [Lighting] 난반사(Diffuse Reflection)와 램버튼 법칙(Lambert's cosine law) (0) | 2025.09.15 |
| [DirectX 11] D3D11 렌더 타겟 뷰(RTV)와 SwapChain 개념 (0) | 2025.09.10 |
| [DirectX 11] 2D 변환 행렬 (0) | 2025.06.11 |