как использовать glCopyImage2D

Я пытаюсь что-то вроде

glEnable(texture_2d)
glBindTexture
glCopyTexImage2D
glDisable(GL_TEXTURE_2D);

Я думаю, что glCopyTexImage2D не будет работать с немощностью двух изображений, так что это одна проблема; я также пробовал glReadPixels, но это слишком медленно для моих целей.

3 ответов


если glReadPixels слишком медленно для вас, то glCopyTexImage2D и glCopyTexSubImage2D не собираются быть намного быстрее. На платформах с поддержкой объектов framebuffer, таких как iOS, рекомендуемый (т. е. более быстрый) способ получить данные изображения, отображаемые GPU, в текстуру-использовать эту текстуру в качестве цветового вложения для объекта framebuffer и визуализировать непосредственно в него. Тем не менее, если вы все еще хотите следовать этому методу, вот что вам нужно сделать, чтобы исправить это:

во-первых, вы передаете плохие аргументы к glCopyTexImage2D. Третий аргумент:--4-->, вероятно, должен быть GL_RGBA вместо 0. Если бы вы позвонили glGetError после вызова glCopyTexImage2D, вы, вероятно, получили GL_INVALID_OPERATION. См. справочные страницы OpenGL ES 1.1 для glCopyTexImage2D и glCopyTexSubImage2D.

во-вторых, как вы уже наблюдали, glCopyTexImage2D требует, чтобы его аргументы ширины и высоты также были силой двух. Правильный способ справиться с этим, чтобы выделить текстуру используя glTexImage2D (вы можете передать NULL на pixels здесь), а затем использовать glCopyTexSubImage2D чтобы скопировать содержимое фреймбуффера в прямоугольник. Обратите внимание, что glCopyTexSubImage2D, а не internalformat аргумент-поскольку он обновляет подправку текстуры, он использует существующий формат текстуры.

для записи glGetTexImage не существует в OpenGL ES 1.1 или 2.0, поэтому вы получаете неявное объявление.


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


чтобы помочь выяснить, является ли проблема" немощностью двух", используйте glGetError () следующим образом:

printf("error: %#06x\n", glGetError());

поместите это в разных местах кода, чтобы убедиться, какая строка вызывает проблему, а затем проверьте код ошибки здесь:https://www.khronos.org/opengl/wiki/OpenGL_Error

чтобы скопировать текстуру, которую я сделал:

glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0);
glGenerateMipmap(GL_TEXTURE_2D);

после привязки текстуры. Проверьте документы по этим двум функциям для получения дополнительной информации.