[컴퓨터그래픽스: 부록] Column Major

Serun1017·2024년 10월 23일
0

컴퓨터그래픽스

목록 보기
30/31

Column Major은 행렬을 메모리에 저장하는 방식 중 하나로, 열(Column) 단위로 데이터를 순차적으로 저장하는 방식이다.

다음과 같은 행렬 MM 이 있다고 하면

M=[m00m01m02m03m10m11m12m13m20m21m22m23m30m31m32m33]M = \begin{bmatrix} m_{0 0} & m_{0 1} & m_{0 2} & m_{0 3} \\ m_{1 0} & m_{1 1} & m_{1 2} & m_{1 3} \\ m_{2 0} & m_{2 1} & m_{2 2} & m_{2 3} \\ m_{3 0} & m_{3 1} & m_{3 2} & m_{3 3} \end{bmatrix}

Column Major 방식에선 이 행렬을 메모리에 다음과 같이 저장한다.
메모리순서:[m00,m10,m20,m30,m01,m11,m21,m31,m02,m12,m22,m32,m03,m13,m23,m33]메모리 순서: [m_{0 0}, m_{1 0}, m_{2 0}, m_{3 0}, m_{0 1}, m_{1 1}, m_{2 1}, m_{3 1}, m_{0 2}, m_{1 2}, m_{2 2}, m_{3 2}, m_{0 3}, m_{1 3}, m_{2 3}, m_{3 3}]

반대로 Raw Major 방식은 각 행의 값들을 차례대로 저장한다.
메모리순서:[m00,m01,m02,m03,m10,m11,m12,m13,m20,m21,m22,m23,m30,m31,m32,m33]메모리순서: [m_{0 0}, m_{0 1}, m_{0 2}, m_{0 3}, m_{1 0}, m_{1 1}, m_{1 2}, m_{1 3}, m_{2 0}, m_{2 1}, m_{2 2}, m_{2 3}, m_{3 0}, m_{3 1}, m_{3 2}, m_{3 3}]

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 방식으로 메모리에 저장되며, 행렬 곱셉에서 기대되는 결과를 얻기 위해 적절한 방식으로 행렬을 처리하게 된다.

0개의 댓글