MOONSUN
[D3D 이론] OpenGL vs DirectX 행렬 표현 차이 및 DirectX의 행렬 불일치로 인한 Transpose 본문
D3D
[D3D 이론] OpenGL vs DirectX 행렬 표현 차이 및 DirectX의 행렬 불일치로 인한 Transpose
MoonSun_v 2025. 9. 10. 19:27
1. 메모리에서 행렬 저장 방식
행렬을 코드로 다룰 때는 메모리에 어떻게 저장되느냐 가 중요한 문제일 수 있다.
예를 들어 4×4 행렬 M이 있다고 한다면,
[ m11 m12 m13 m14 ]
[ m21 m22 m23 m24 ]
[ m31 m32 m33 m34 ]
[ m41 m42 m43 m44 ]
1-1. Row-major (행 우선, C/C++ 기본)
메모리에 이렇게 저장됨:
m11 m12 m13 m14 m21 m22 m23 m24 m31 m32 m33 m34 m41 m42 m43 m44
(한 행씩 연속 저장)
1-2. Column-major (열 우선, OpenGL 기본)
메모리에 이렇게 저장됨:
m11 m21 m31 m41 m12 m22 m32 m42 m13 m23 m33 m43 m14 m24 m34 m44
(한 열씩 연속 저장)
2. OpenGL vs DirectX 차이 (수학적 견해)
| 구분 | OpenGL | DirectX |
| 기본 행렬 저장 방식 | Column-major (열 단위) | Row-major (행 단) |
| 벡터 표현 | 열 벡터 (column vector, 세로로 씀) | 행 벡터 (row vector, 가로로 씀) |
| 연산 방식 | v' = M x v | v' = v x M |
- Column Vector (OpenGL) → 변환 순서: Model * View * Projection * v
- Row Vector (DirectX/HLSL) → 변환 순서: v * Model * View * Projection
3. DirectX에서의 행렬 불일치
위에서 정리한 수학적 견해(행/열 벡터)와는 별개로,
실제로 CPU 메모리에 행렬을 저장할 때는 row-major / column-major 방식 중 하나를 선택해야 함.
- OpenGL 쪽 라이브러리 :
- column-major 저장을 기본으로 채택 → GPU(column-major 해석)와 잘 맞음.
- DirectXMath :
- row-major 저장을 기본으로 채택.
- → 하지만 GPU(HLSL)는 column-major 해석을 기본으로 하기 때문에 불일치(mismatch) 발생.
4. DirectX에서 행렬 불일치로 인한 Transpose 사용
위에서 보았듯,
DirectX는 row-vector convention(수학적 약속)을 채택했지만,
GPU 상수 버퍼는 column-major 해석을 기본으로 사용.
즉, C++에서 저장-해석의 행렬이 불일치 하기 때문에 행렬(row-major)을 GPU에 줄 때 Transpose 해서 맞춰주어야 함.
'D3D' 카테고리의 다른 글
| [그래픽스] 빛(Lighting) 모델 : Lambertian Shading (램버트 조명 모델) (0) | 2025.09.15 |
|---|---|
| [D3D] 상수버퍼(Constant Buffer) 와 HLSL 정렬규칙 (0) | 2025.09.10 |
| [D3D 이론] 기저벡터(Basis Vector)와 행렬(Matrix) (0) | 2025.09.10 |
| [D3D] DirectX 11에서 HLSL 셰이더 컴파일 2가지 방법 (0) | 2025.09.05 |
| [D3D] Comptr 사용해보자 (0) | 2025.09.05 |