Я грунтовно плутаюся з визначеннями матриць. У мене є клас матриці, який містить, як 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, вказуючи, що він є основним стовпцем, інакше такі перетворення, як translate / scale тощо не застосовуються належним чином:
Якщо транспонування має значення GL_FALSE, передбачається, що кожна матриця подається у великому порядку стовпця. Якщо транспонування має значення GL_TRUE, передбачається, що кожна матриця подається у великому порядку рядка.
Чому мою матрицю, яка видається основною у рядку, потрібно передавати OpenGL як головну колонку?
GL_FALSE
?" Як ти використовуєш форму?