как использовать glCopyImage2D - PullRequest
8 голосов
/ 19 июня 2010

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

glEnable(texture_2d)
glBindTexture
glCopyTexImage2D
glDisable(GL_TEXTURE_2D);

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

Ответы [ 4 ]

9 голосов
/ 19 июня 2010

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

Сначала вы передаете неверные аргументы glCopyTexImage2D.Третий аргумент internalformat, вероятно, должен быть 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 голосов
/ 21 июня 2010

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

0 голосов
/ 22 марта 2019

glCopyTexImage2D работает с изображением NPOT.

Изображение NPT (без двух степеней) ограничено, поддерживается OpenGLES 2 / OpenGL 1 или WebGL, в OpenGLES 3 / OpenGL 2 или более поздней версии оно полностью

Если вы хотите скопировать вложение цвета fbo в newTexture.

glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glReadBuffer(GL_COLOR_ATTACHMENT0);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, newTexture);
glTexImage2D(bindTarget, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

glCopyTexSubImage2D(target, level, 0, 0, 0, 0, width, height);

NPT-изображение будет выводить черный цвет при выборке фрагмента шейдера, если текстурный мип-карта, фильтр увеличения инеправильная настройка режима повтора.

0 голосов
/ 18 февраля 2018

Чтобы выяснить, является ли проблема "не степенью двойки", используйте 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);

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

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