Чтобы расширить ответ @ Джерри, я проведу вас по шагам, поскольку вы новичок. Сначала мы создадим объект буфера кадра:
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);
Некоторые оговорки:
- Размер буфера кадра должен быть степенью двойки.
- На последнем iPhone вы можете получить разрешение до 1024x1024, но вам может не понадобиться этот уровень детализации.