Я сильно запутался в определениях матриц. У меня есть матричный класс, который содержит a float[16]
, который, как я предполагал, является строковым, на основе следующих наблюдений:
float matrixA[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
float matrixB[4][4] = { { 0, 1, 2, 3 }, { 4, 5, 6, 7 }, { 8, 9, 10, 11 }, { 12, 13, 14, 15 } };
matrixA
и matrixB
оба имеют одинаковый линейный макет в памяти (т.е. все числа в порядке). В соответствии с http://en.wikipedia.org/wiki/Row-major_order это указывает на макет строки.
matrixA[0] == matrixB[0][0];
matrixA[3] == matrixB[0][3];
matrixA[4] == matrixB[1][0];
matrixA[7] == matrixB[1][3];
Следовательно, matrixB[0]
= строка 0, matrixB[1]
= строка 1 и т.д. Опять же, это указывает на макет строки.
Моя проблема/путаница возникает, когда я создаю матрицу перевода, которая выглядит так:
1, 0, 0, transX
0, 1, 0, transY
0, 0, 1, transZ
0, 0, 0, 1
который выложен в памяти как { 1, 0, 0, transX, 0, 1, 0, transY, 0, 0, 1, transZ, 0, 0, 0, 1 }
.
Затем, когда я вызываю glUniformMatrix4fv, мне нужно установить флаг транспонирования в GL_FALSE, указывая на то, что он имеет значение столбца, иначе преобразует, например, перевод/масштаб и т.д. t применяется правильно:
Если транспонирование GL_FALSE, предполагается, что каждая матрица представлена в главный заказ. Если транспонирование GL_TRUE, каждая матрица предполагается поставляться в основном порядке.
Почему моя матрица, которая, как представляется, имеет большое значение строки, должна быть передана OpenGL в качестве основного столбца?