2014-02-13 3 views
2

Я пытаюсь загрузить программу C++, которая использует SFML и OpenGL, которые я написал из Windows в Mac OS X. Я использую g ++ для компиляции на обеих платформах.Портирование C++ OpenGL из окон в Mac. Что делать с GLKMatrix4MakePerspective?

Вот мой текущий код для вычисления матрицы проекции:

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 
} 

Однако г ++ говорит, что gluPerspective является устаревшим, и я должен использовать вместо GLKMatrix4MakePerspective. Я нашел the manual page о функции, но я не уверен, как ее интегрировать с остальной частью моего кода. Что мне делать?

ответ

5

Весь ваш код матрицы устарел в современном OpenGL. Вы можете продолжать использовать его на Mac (предупреждения и все), если у вас есть GL 2.x контекст, но если вы хотите использовать GL 3.2 или новее, вы получите только контекст Core Profile, и для этого вам нужно перейти на современный Код OpenGL. (То же самое, если вы хотите использовать OpenGL ES 2.0 или новее на мобильных платформах.)

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

Часть этого базового материала находит (или записывает) математическую библиотеку для генерации всех матриц, которые вы передадите вершинному шейдеру для выполнения ваших преобразований. GLKMatrix4 является частью библиотеки Apple для таких вещей. GLKMatrix4MakePerspective принимает почти тот же набор аргументов, что и gluPerspective (вертикальное FOV в радианах, соотношение сторон, ближнее расстояние отсечения, дальность отсечения), но вместо установки состояния матрицы фиксированной функции он возвращает структуру данных GLKMatrix4.

Затем вы передаете эту структуру данных вершинному шейдеру через однородную переменную. Или, если вы все равно работаете с GLKit, вы можете посмотреть в [GLKBaseEffect] [2], который предоставляет интерфейс Objective-C, примерно аналогичный старому конвейеру с фиксированной функцией.

Работа со всем процессом перехода на современный OpenGL выходит за рамки одного ответа SO. Вот несколько ресурсов:

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