Я пытаюсь портировать программу на С ++, которая использует SFML и OpenGL, которые я написал из Windows, на Mac OS X. Я использую g ++ для компиляции на обеих платформах.
Вот мой текущий код для расчета матрицы проекции:
void perspectiveCalculate (int width, int height) {
// Prevent A Divide By Zero
if (height<1) height=1;
if (width<1) width=1;
glViewport(0, 0, width, height); // Reset The Current Viewport
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
//field of vision , width , height , near clipping , far clipping
//and calculate The Aspect Ratio Of The Window
gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 1000.0f);
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
}
Однако g ++ говорит, что gluPerspective устарела, и вместо этого я должен использовать GLKMatrix4MakePerspective. я нашел страница руководства на функции, но я не уверен, как интегрировать его с остальной частью моего кода. Что я должен делать?
Весь ваш матричный код там устарел в современном OpenGL. Вы можете продолжать использовать его на Mac (предупреждения и все), если у вас есть контекст GL 2.x, но если вы хотите использовать GL 3.2 или новее, вы получаете только контекст Core Profile, и для этого вам нужно перейти на современный Код OpenGL. (То же самое, если вы хотите использовать OpenGL ES 2.0 или новее на мобильных платформах.)
В современном OpenGL все функции настройки матрицы, которые вы используете, исчезли. Конвейер с фиксированными функциями, с которым они идут, заменяется программируемым конвейером … вместо того, чтобы сообщать OpenGL, какую модель, представление и матрицы проекций вы хотите, и чтобы она выполняла преобразования за вас, вы выполняете преобразования самостоятельно в вершинном шейдере GLSL. , Хорошая новость заключается в том, что теперь вы можете использовать программируемые шейдеры для создания всевозможных эффектов, невозможных в конвейере с фиксированными функциями. Плохая новость в том, что вы должны сами делать основные вещи.
Частью выполнения этого базового материала является поиск (или написание) математической библиотеки для генерации всех матриц, которые вы будете передавать вершинному шейдеру для выполнения ваших преобразований. GLKMatrix4
является частью библиотеки Apple для таких вещей. GLKMatrix4MakePerspective
принимает почти тот же набор аргументов, что и gluPerspective
(вертикальное поле зрения в радианах, соотношение сторон, близкое расстояние отсечения, дальнее расстояние отсечения), но вместо установки состояния матрицы с фиксированной функцией возвращается GLKMatrix4
структура данных.
Затем вы передаете эту структуру данных в вершинный шейдер через единую переменную. Или, если вы все равно работаете с GLKit, вы можете посмотреть в [GLKBaseEffect
] [2], который предоставляет интерфейс Objective-C, примерно аналогичный старому конвейеру с фиксированными функциями.
Решение всего процесса перехода на современный OpenGL выходит за рамки одного ответа SO. Вот несколько ресурсов:
GLKBaseEffect
, Часть GL в значительной степени одинакова как для iOS, так и для OS X.Других решений пока нет …