Левые расчеты в OpenGL - PullRequest
       34

Левые расчеты в OpenGL

0 голосов
/ 26 августа 2011

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

Мой движок и игра изначально были разработаны для DirectX, которая представляет собой левостороннюю систему, которая использует матричную структуру ряда строк.Мой математический код полностью самодельный и отлично работает в рамках этой системы.Я нахожусь в точке, где я хочу дать моей игре рендерер OpenGL.Поскольку во всей моей математике используется матричная система с левой мажорной строкой (например, для создания матрицы проекции), насколько трудно будет перенести мою математику на левую систему с основными столбцами?

Это вопрос транспонирования матрицы и вставки значений в основную структуру столбца?Или я слишком упрощаю это.

Ответы [ 2 ]

1 голос
/ 26 августа 2011

Это зависит. Мы говорим о шейдерном OpenGL или фиксированной функции (FF)?

В земле FF вам нужно использовать gluPerspective (или glFrustum) для генерации матрицы перспективы, используя те же параметры, которые вы задали бы своему коду в D3D. Затем вам нужно транспонировать матрицы, которые вы вычислили бы для D3D (исключая компонент проекции вычислений), чтобы сделать мажор столбца, так, как этого хочет glLoad / MultMatrix.

И затем вам нужно сгенерировать матрицу, чтобы перевернуть вашу сцену, которую вы поместили в самый низ стека GL_MODELVIEW. Самый простой способ выяснить, что делать, это просто отрендерить все и посмотреть, как мир перевернут. Затем вставьте туда матрицу, которая отрицает вдоль оси; если это исправит, все готово.

В псевдокоде вы делаете следующее:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(/*Projection parameters here*/);

glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(/*Your flip matrix here*/);
glPushMatrix();

//Render your stuff here.
//When rendering an object:
Matrix mat = ComputeD3DModelToCameraMatrixForObject();
mat = Transpose(mat);
glPushMatrix();
glMultMatrixf(GetMatrixAsFloatArray(mat));
//Draw the object.
glPopMatrix();

//When finished rendering stuff:
glPopMatrix();

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

Действительно, все, что вам нужно сделать, это посмотреть на разницу между пространством клипа, которое использует OpenGL, и пространством клипа, которое использует D3D. Clip-space - это пространство позиций вершин, выводимых из вершинного шейдера. Вы можете передать свои матрицы в GLSL как обычно, поскольку у функций glUniformMatrix есть параметр, который позволяет вам указать, будет ли матрица транспонирована (главная строка). После того, как вы вычислили позиции в пространстве клипа D3D, как это было бы для D3D, просто измените результаты в зависимости от того, что ожидает OpenGL.

Я не припоминаю различий, но раздел 2.13 спецификации OpenGL (в версии 3.3 это может быть другой раздел для других версий) очень подробно описывает ожидаемую систему координат, а также последующие преобразования в оконное пространство.

0 голосов
/ 26 августа 2011
...