Column Major은 행렬을 메모리에 저장하는 방식 중 하나로, 열(Column) 단위로 데이터를 순차적으로 저장하는 방식이다.
다음과 같은 행렬 M 이 있다고 하면
M=⎣⎢⎢⎢⎡m00m10m20m30m01m11m21m31m02m12m22m32m03m13m23m33⎦⎥⎥⎥⎤
Column Major 방식에선 이 행렬을 메모리에 다음과 같이 저장한다.
메모리순서:[m00,m10,m20,m30,m01,m11,m21,m31,m02,m12,m22,m32,m03,m13,m23,m33]
반대로 Raw Major 방식은 각 행의 값들을 차례대로 저장한다.
메모리순서:[m00,m01,m02,m03,m10,m11,m12,m13,m20,m21,m22,m23,m30,m31,m32,m33]
Column Major 와 Row Major의 차이점
Column Major
- 데이터를 열 단위로 메모리에 저장
- 그래픽스 라이브러리에서 주로 사용(OpenGL, GLSL 등)
- 수학적으로 선형대수 연산에서 행렬을 다룰 때 편리한 방식
Row Major
- 데이터를 행 단위로 메모리에 저장
- 일반적인 프로그래밍 언어(예: C, C++)에서 배열의 기본 메모리 저장 방식
- DirectX와 같은 그래픽 라이브러리에서는 Row Major 방식을 사용하기도 한다.
OpenGL에서 Column Major를 사용하는 이유
OpenGL과 같은 그래픽 API에서는 행렬 연산을 자주 수행하며, 수학적으로 변환 행렬을 사용할 때 열 우선 방식이 더 자연스러운 경우가 많다. 특히 3D 그래픽스에서는 좌표 변환을 행렬 곱셉으로 처리하는 데, 이때 Column Major가 연산적으로 더 유리하게 작동할 수 있다.
예를 들어, OpenGL에서 4x4 변환 행렬을 사용할 때, mat4
타입은 Column Major 방식으로 메모리에 저장되며, 행렬 곱셉에서 기대되는 결과를 얻기 위해 적절한 방식으로 행렬을 처리하게 된다.