Я пытаюсь изучить OpenGLES 2.0 для iPhone и был озадачен проектом шаблона, который Apple предоставляет в xCode. >
Проект по умолчанию показывает 2D-квадрат, но я хочу поэкспериментировать с добавлением вершин различной глубины по оси Z.
В проекте Apple OpenGL по умолчанию они нарисуйте 2D-квадрат, используя только Координаты x и y передаются в вершинный шейдер.
Чтобы поэкспериментировать с размещением вершин в трехмерном пространстве, я добавил значение z к данным вершин в примере проекта. Затем я изменил параметр размера в методе glVertexAttribPointer с 2 на 3. Я изменил значения z на вершинах в надежде, что это приведет к тому, что квадрат будет казаться наклоненным назад при запуске программы.
Проблема в том, что он по-прежнему отображается как тот же 2D-квадрат. Судя по моему прочтению, я считаю, что это вызвано тем, что для матрицы проекции установлено значение "Ортографическая", а не "Перспектива".
Вопрос:
Как изменить матрицу проекции с ортогональной на перспективную с помощью OpenGLES 2.0 в шаблонном проекте OpenGL от Apple?
Я пробовал:
Код: Выделить всё
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.0, 1.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);
Подробнее здесь: https://stackoverflow.com/questions/449 ... te-project
Мобильная версия