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
,