Матрица проекции в проекте Apple OpenGLES 2.0 Template Apple - PullRequest
1 голос
/ 20 декабря 2010

Справочная информация:

Я пытаюсь изучать OpenGLES 2.0 для iPhone и был озадачен проектом шаблона, который Apple предоставляет в xCode.

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

В проекте Apple OpenGL по умолчанию они рисуют двухмерный квадрат, используя только координаты x и y, переданные вершинному шейдеру.

Чтобы поэкспериментировать с размещением вершин в трехмерном пространстве, я добавил значение azк данным вершины в примере проекта.Затем я изменил параметр размера в методе glVertexAttribPointer с 2 на 3. Я изменил значения z на вершинах в надежде, что при запуске программы квадрат будет казаться наклоненным назад.

Проблема в том, что он все еще отображается в виде того же 2-го квадрата.Из моего чтения я полагаю, что это вызвано тем, что матрица проекции установлена ​​на Ортогональный вместо Перспективы.

Вопрос:

Как изменить матрицу проекции с ОртогональнойПерспективы использования OpenGLES 2.0 в шаблоне Apple проекта OpenGL?

Я пробовал:

glMatrixMode (GL_PROJECTION);glLoadIdentity ();glFrustumf (-0,5, 0,5, -0,5, 0,5, 1, 10);

Но это не изменило результат.

Я также пытался добавить что-то подобное в программу вершинного шейдера:


mat4 projectionMatrix = {2,0 / 320,0, 0,0, 0,0, -1,0, 0,0, 2,0 / 480,0, 0,0, -1,0, 0,0, 0,0, -1,0, 0,0, 0,0, 0,0, 0,01.0};

gl_Position * = projectionMatrix;


Но это тоже не сработало.


Способ установки матрицы проекции, отличный для OpenGLES 2.0, которыйэто было для 1.0.Я думаю, может быть, то, что я пробую, несовместимо с 2.0.

Заранее спасибо.

Майк

Обновление

Спасибо за вашу помощь Джон.Я очень ценю это.Я попытался добавить буфер глубины на основе вашего предложения, добавив следующий код в метод createFramebuffer в моем представлении EAGL, но все еще без изменений.

// Create depth render buffer and allocate backing store.
        glGenRenderbuffers(1, &depthRenderbuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);

        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, framebufferWidth, framebufferHeight);

        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);

И если я добавлю следующий код в мой метод рендеринга:

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glFrustumf(-0.5, 0.5, -0.5, 0.5, 1, 10);

Xcode выдает исключение.Есть мысли?

Ответы [ 2 ]

1 голос
/ 23 декабря 2010

Я наконец получил проекцию на работу.

Итак, это не проблема буфера глубины, поскольку, очевидно, она не нужна, если вы не структурируете несколько объектов на нескольких глубинах, как я слышал.

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

Взглянув на код Джеффа ЛеМарша, опубликованный как часть его глав на Opengles 2.0, я обнаружил, что он использовал файл с кучей удобных методов для генерации матрицы перспективы (и многих других полезных вещей).Вы можете найти этот пример проекта здесь: http://iphonedevelopment.blogspot.com/2010/07/opengl-es-20-book-teaser.html Файл называется GLCommon.Спасибо, Джефф!

Чтобы создать и применить матрицу проекции, я использовал метод Matrix3DSetPerspectiveProjectionWithFieldOfView из файла GLCommon.

, который устанавливает матрицу, которую можно передать в вершинный шейдеркак униформа, затем умножается на атрибут позиции и затем передается в gl_Position.

Потребовались некоторые корректировки ближнего и дальнего значений в Matrix3DSetPerspectiveProjectionWithFieldOfView, чтобы получить материал, который будет отображаться в поле зрения.

В качестве подсказки для других людей, пытающихся изучать OpenGLES 2.0, в Интернете есть тонна информации о том, как делать вещи в OpenGLES, которая предназначена для 1.0, но не говорит об этом, поскольку она, вероятно, была опубликованадо 2.0 вышло.Проверяйте заголовки 2.0 всякий раз, когда пытаетесь что-то сделать, чтобы убедиться, что код будет работать с 2.0.Если вы используете шаблонный проект Apple, он включает в себя фреймворки для обеих версий, поэтому ваш код 1.0 не будет признан проблемным, пока вы не соберете и не запустите.

0 голосов
/ 20 декабря 2010

Похоже, вы используете пример, который по умолчанию не использует буфер глубины. Ищите ссылки на GL_DEPTH_COMPONENT16 в примере проекта и используйте буфер глубины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...