OpenGL ES 3.0: нулевая копия рендеринга процессора в текстуру?

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

Мне нужно сделать некоторую постобработку (добавить еще один слой с несколькими блитами), и мои ранние тесты показали, что это может быть проблема производительности, связанная только с CPU, поэтому мне нужно ускорение GPU (2D будет намного лучше, но это не распространено / портативный в эти дни...).

Моя целевая платформа - встроенная система (ARM), в которой GPU и CPU разделяют память, поэтому теоретически я мог бы сделать это без какой-либо копии. Выбранная платформа поддерживает OpenGL 2.1 и OpenGL ES 3.0.

Я понимаю, что объекты буфера могут быть отображены с помощью glMapBufferRange (). Я посмотрел после возможностей ниже:

  • UNIFORM_BUFFER: слишком мало для хранения полноэкранного изображения

  • SHADER_STORAGE_BUFFER: поддерживается только в ES 3.1

  • Хранилище загрузки изображений шейдеров: поддерживается только в ES 3.1

  • Buffer Texture: ES 3.0 не поддерживает (поддерживается с??)

  • Pixel Buffer Objects: я не могу достать их из шейдеров, и мне кажется, что он копирует, когда я обновляю текстуру с него. Я не знаю, быстрее ли это, чем копирование из клиентской памяти (учитывая, что все они находятся на одном чипе ОЗУ:))

  • простые текстуры: не являются буферными объектами, не могут быть отображены в память процесса клиента

Я что-то пропустил? В ES 3.0 нет способа поделиться буфером с графическим процессором, содержащим огромное количество данных, которые я могу записать из CPU и прочитать из шейдеров фрагментов?

1 ответ

Вы можете изменить текстуру частично с GLES20.glTexSubImage2D,

Другие вопросы по тегам