Notice
Recent Posts
Recent Comments
Link
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

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 해서 맞춰주어야 함.