Это зависит. Мы говорим о шейдерном 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 это может быть другой раздел для других версий) очень подробно описывает ожидаемую систему координат, а также последующие преобразования в оконное пространство.