Обновление текстуры в OpenGL с помощью glTexImage2D

Являются ли glTexImage2D и glTexSubImage2D единственными способами передать буфер пикселей в текстуру?

На данный момент я использую в настройке функцию glTexImage2D, передавая null в качестве буфера, а затем в цикле рендеринга я вызываю glTexSubImage2D с новыми данными буфера на каждой итерации.

Но зная, что текстура не изменит никаких свойств, таких как размеры, есть ли более эффективный способ передать фактические данные пикселей в текстуру рендеринга?


person PerracoLabs    schedule 25.03.2012    source источник


Ответы (1)


В современных OpenGL есть 4 разных метода обновления 2D-текстур:

  1. glTexImage2D - самый медленный, пересоздает внутренние структуры данных.

  2. glTexSubImage2D - немного быстрее, но не может изменить параметры (размер, формат пикселей) изображения.

  3. Render-to-texture with FBO — обновление текстуры полностью на графическом процессоре, очень быстро. Подробнее см. в этом ответе: https://stackoverflow.com/a/10702468/1065190

  4. Pixel Buffer Object PBO — для быстрой загрузки из CPU в GPU, не поддерживается (пока) в OpenGL ES.

person Sergey K.    schedule 06.11.2012
comment
Я вижу, что FBO был бы лучшим вариантом, но мои текстуры должны использовать параметр GL_LUMINANCE, и я только что узнал, что FBO не поддерживает такой параметр. Тогда единственный вариант использовать glTexSubImage2D? - person PerracoLabs; 07.11.2012
comment
Используете ли вы настольный OpenGL или OpenGL ES? - person Sergey K.; 07.11.2012
comment
с помощью OpenGL ES на Android. Причина использования GL_LUMINANCE заключается в том, что я должен передать данные YUV420sp в шейдер, для чего я делаю 2 вызова glTexSubImage2D для передачи 2 плоскостей, одну для Y, а другую для UV. и поэтому я должен использовать GL_LUMINANCE. вариант преобразования YUV в RGB перед передачей данных в шейдер не подходит из соображений скорости. - person PerracoLabs; 07.11.2012
comment
Вы должны сравнить производительность рендеринга в RGB FBO и TexSubImage2D/GL_LUMINANCE. Если RGB FBO быстрее — просто используйте его. Если это не так - используйте TexSubImage2D. - person Sergey K.; 07.11.2012