Как сохранить и перерисовать содержимое экрана в OpenGL ES - PullRequest
4 голосов
/ 13 февраля 2011

Я работаю над своего рода игрой для iPhone, где игрок путешествует через программно созданную червоточину.Чтобы нарисовать червоточину, я решил нарисовать массивы текстурированных вертикальных линий шириной в один пиксель для реализации верхней и нижней стенок червоточины.В каждом кадре все линии должны быть сдвинуты влево, чтобы реализовать движение игрока, а новые линии должны быть утоплены в свободном пространстве справа.Но рисование 1000 текстурированных прямоугольников в каждом кадре убивает мой FPS.И я ищу решение, чтобы сохранить все линии, которые были утоплены в предыдущем кадре, и перерисовать их полностью в новую смещенную позицию.Было бы замечательно, если бы был способ нарисовать текстурированные прямоугольники в каком-то буфере, который больше экрана, и затем отобразить этот буфер на экране.Новое в OpenGL.Я часами пытался это выяснить, но мне это не удалось.Так что любая помощь приветствуется.

Ответы [ 2 ]

3 голосов
/ 13 февраля 2011

Чтобы расширить ответ @ Джерри, я проведу вас по шагам, поскольку вы новичок. Сначала мы создадим объект буфера кадра:

GLuint framebuffer;
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);

Далее мы создадим пустую текстуру для хранения нашего снимка. Это просто обычный материал для создания текстур OpenGL, и вы можете, конечно, изменить его под свои нужды. Единственная заметная строка - это строка glTexImage2D - обратите внимание, что вместо данных пикселей в качестве последней координаты вы можете передать NULL, что создаст пустую текстуру.

GLuint texture;
glGenTextures(1, &texture);

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);

Теперь мы привязываем текстуру к буферу кадров:

glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture, 0);

и проверьте, все ли прошло нормально:

if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
    return false; // uh oh, something went wrong

Теперь мы все готовы к рисованию!

glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
// do drawing here
glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);

И, наконец, очистите буфер кадра, если он вам больше не нужен:

glDeleteFramebuffersOES(1, &framebuffer);

Некоторые оговорки:

  1. Размер буфера кадра должен быть степенью двойки.
  2. На последнем iPhone вы можете получить разрешение до 1024x1024, но вам может не понадобиться этот уровень детализации.
1 голос
/ 13 февраля 2011

Необязательно. Я не знаю точный размер, который будет доступен на конкретной модели iPhone, но общая идея будет заключаться в том, чтобы использовать объект Frame Buffer (FBO) для рендеринга в текстуру, тогда вы можете делать блики из этой текстуры в экранный буфер.

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