Портирование C ++ OpenGL с Windows на Mac. Что делать с GLKMatrix4MakePerspective?

Я пытаюсь портировать программу на С ++, которая использует 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. я нашел страница руководства на функции, но я не уверен, как интегрировать его с остальной частью моего кода. Что я должен делать?

2

Решение

Весь ваш матричный код там устарел в современном 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. Вот несколько ресурсов:

  • http://www.opengl-tutorial.org — Хороший общий учебник. Они используют GLM для математической математики, но вы также можете использовать математическую систему GLKit.
  • Миграция в основной профиль OpenGL — Apple Developer видео
  • Шаблон Xcode «OpenGL Game» — это для OpenGL ES на iOS, но вы можете запустить его в симуляторе, и он предоставляет хороший простой пример того, как использовать GLKit для генерации матриц и передачи их шейдерам или передачи их GLKBaseEffect, Часть GL в значительной степени одинакова как для iOS, так и для OS X.
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]