Я пробую что-то как
glEnable(texture_2d)
glBindTexture
glCopyTexImage2D
glDisable(GL_TEXTURE_2D);
Я думаю, что glCopyTexImage2D не будет работать с непитанием два, отображают, таким образом, это - одна проблема; я также попробовал glReadPixels, но это слишком медленно в моих целях.
Если glReadPixels
слишком медленный для вас, то glCopyTexImage2D
и glCopyTexSubImage2D
не будут намного быстрее . На платформах с поддержкой объектов фреймбуфера, таких как iOS, рекомендуемый (то есть более быстрый) способ получить данные изображения, обработанные с помощью графического процессора, в текстуру - использовать эту текстуру в качестве цветового присоединения для объекта фреймбуфера и выполнять рендеринг непосредственно в нем. Тем не менее, если вы все еще хотите использовать этот метод, вот что вам нужно сделать, чтобы исправить это:
Во-первых, вы передаете неверные аргументы в glCopyTexImage2D
. Третий аргумент, внутренний формат
, вероятно, должен быть GL_RGBA
вместо 0
. Если бы вы вызвали glGetError
после вызова glCopyTexImage2D
, вы, вероятно, получили бы GL_INVALID_OPERATION
. См. Справочные страницы OpenGL ES 1.1 для glCopyTexImage2D и glCopyTexSubImage2D .
Во-вторых, как вы уже заметили, glCopyTexImage2D
требует, чтобы его аргументы ширины и высоты также были степенью двойки.Правильный способ справиться с этим - выделить изображение текстуры с помощью glTexImage2D
(здесь можно передать NULL
для пикселей
), затем использовать glCopyTexSubImage2D
, чтобы скопировать содержимое фреймбуфера в прямоугольник. Обратите внимание, что glCopyTexSubImage2D
не принимает аргумент internalformat
- поскольку он обновляет подпрямоугольник текстуры, он использует существующий формат текстуры.
Для записи, glGetTexImage не существует в OpenGL ES 1.1 или 2.0, поэтому вы получаете неявное объявление.
Вы можете проверить, поддерживает ли видеокарта non-power of 2 текстуры, если она поддерживает расширение ARB_texture_non_power_of_two. См. Здесь для информации.