Правильный формат матрицы OpenGL? - PullRequest
11 голосов
/ 05 декабря 2010

У меня просто вопрос: каков правильный формат матрицы проекции и ModelView?

Мне сказали, что следующие примеры матриц транспонированы и построены не так, как должны быть матрицы OpenGL.

ModelView Matrix
{(1, 0, 0, 0)
(0, 0.7071068, 0.7071068, 0)
(0, -0.7071068, 0.7071068, 0)
(0, -141.4214, -141.4214, 1)}

Projection Matrix
{(1.931371, 0, 0, 0)
(0, 2.414213, 0, 0)
(0, 0, -1.0002, -1)
(0, 0, -2.0002, 0)}

Ответы [ 2 ]

22 голосов
/ 05 декабря 2010

Изменить: этот ответ серьезно нуждается в обновлении. А именно, нет никаких соображений по поводу шейдеров.

Как указывает @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, поэтому это не должно быть проблемой.

5 голосов
/ 20 сентября 2015

Вы можете использовать любые обозначения, которые вам нравятся, если вы соответствуете порядку матричных операций. Цитата из https://www.opengl.org/archives/resources/faq/technical/transformations.htm:

9.005 Являются ли матрицы OpenGL основной или основной строкой?

Для целей программирования матрицы OpenGL представляют собой 16-значные массивы с базовые векторы выложены непрерывно в памяти. Перевод компоненты занимают 13-й, 14-й и 15-й элементы из 16 элементов матрица, где индексы пронумерованы от 1 до 16, как описано в раздел 2.11.2 спецификации OpenGL 2.1.

Основной столбец против основного ряда - это чисто условное обозначение. Заметка что постмножение с матрицами мажорных столбцов приводит к тому же результат как предварительное умножение с основными рядами матриц. OpenGL Спецификация и Справочное руководство OpenGL используют основной столбец нотации. Вы можете использовать любое обозначение, если оно четко указано.

т.е. в шейдере вы можете загрузить матрицы преобразования в виде массивов с плавающей точкой, упорядоченных по столбцам в униформу и предварительно умножив вершину для ее преобразования:

gl_Position = Proj * View * Model * vPosition;

или загрузите те же матрицы, что и массивы с плавающей точкой, упорядоченные по строкам и после умножения для достижения того же эффекта:

gl_Position = vPosition * Model * View * Proj;

Транспонируя матрицу, вы эффективно преобразуете ее для сохранения в противоположной нотации, поэтому в OpenGL есть опции для транспонирования матриц по мере их ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...