Изменить: этот ответ серьезно нуждается в обновлении. А именно, нет никаких соображений по поводу шейдеров.
Как указывает @gman в комментариях, использовать мажор строки или мажор зависит от того, как вы выполняете математику. Вы можете выбрать один или другой (или даже оба в разное время, если не считаете, что это сбивает с толку), если они соответствуют вашим системам координат и порядку операций.
Я оставляю этот ответ как вики сообщества, если у кого-то есть время и желание его обновить.
OpenGL определяет матрицы как одномерный массив, перечисленный в основном порядке столбцов, то есть с элементами, упорядоченными следующим образом:
m0 m4 m8 m12
m1 m5 m9 m13
m2 m6 m10 m14
m3 m7 m11 m15
Таким образом, если вы инициализируете массив таким способом, в C или почти любом другом языке, результирующая матрица будет выглядеть так, как будто она нуждается в транспонировании, потому что код C читает сначала слева направо, а затем сверху вниз (в другими словами, как если бы это было в порядке следования строк):
int mat[16] = {
0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11,
12, 13, 14, 15,
}
Кстати, в OpenGL есть glLoadTransposeMatrix и glMultTransposeMatrix , которые вы можете использовать вместо glLoadMatrix и glMultMatrix, поэтому это не должно быть проблемой.