# Row Major vs Column Major

Ignoring nifty tricks like z-order and Morton coding, there are two ways to code and use a matrix, referred to as:

Your application can use either notation, but must be consistent. See the next sections for details and caveats.

## Column-Major

• Standard widely used for OpenGL.
• Values are stored in column-first order (see below)
• Transpose of row-major.
• The matrix must be to the LEFT of the multiply operator
• The vertex or vector must to the RIGHT of the operator

Given a matrix:

$$\begin{bmatrix} a_{00} & a_{01} & a_{02} & a_{03} \\ a_{10} & a_{11} & a_{12} & a_{13} \\ a_{20} & a_{21} & a_{22} & a_{23} \\ a_{30} & a_{31} & a_{32} & a_{33} \\ \end{bmatrix}$$

The values would be stored in memory in the order

$$\begin{bmatrix} a_{00} & a_{10} & a_{20} & a_{30} & a_{01} & a_{11} & a_{21} & a_{31} & a_{02} & a_{12} & a_{22} & a_{32} & a_{03} & a_{13} & a_{23} & a_{33} \end{bmatrix}$$

Translation matrix:

$$\begin{bmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & t_w \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} = \begin{bmatrix} x + w * t_x \\ y + w * t_y \\ z + w * t_z \\ t_w \\ \end{bmatrix}$$

## Row-Major

• Used in DirectX and HLSL
• Values are stored in row-first order
• Transpose of column-major
• The matrix must be to the RIGHT of the multiply operator
• The vertex or vector must to the LEFT of the operator

When using the row-major convention, the matrix:

$$\begin{bmatrix} a_{00} & a_{01} & a_{02} & a_{03} \\ a_{10} & a_{11} & a_{12} & a_{13} \\ a_{20} & a_{21} & a_{22} & a_{23} \\ a_{30} & a_{31} & a_{32} & a_{33} \end{bmatrix}$$

Would be stored in memory as

$$\begin{bmatrix} a_{00} & a_{01} & a_{02} & a_{03} & a_{10} & a_{11} & a_{12} & a_{13} & a_{20} & a_{21} & a_{22} & a_{23} & a_{30} & a_{31} & a_{32} & a_{33} \end{bmatrix}$$

Note that in this case, each row occupies a span of four contiguous memory locations.

Translation matrix:

$$\begin{bmatrix} x & y & z & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ t_x & t_y & t_z & t_w \\ \end{bmatrix} = \begin{bmatrix} x + w * t_x, & y + w * t_y, & z + w * t_z, & t_w \\ \end{bmatrix}$$