как использовать 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);
после привязки текстуры. Проверьте документы по этим двум функциям для получения дополнительной информации.