Я работаю над чистым 2D-проектом, где экран обрабатывается процессором, и я хочу отобразить его в виде текстуры, но я не хочу загружать все изображение для каждого кадра. Я не могу сказать, какие части изменены, поэтому я предполагаю, что все изображение недействительно.
Мне нужно выполнить некоторую постобработку (добавление еще одного слоя с несколькими блитами), и мои ранние тесты показали, что это может быть проблема производительности, связанная исключительно с процессором, поэтому мне нужно ускорение графического процессора (2D было бы намного лучше, но это не распространено). /портативный в наши дни...).
Моя целевая платформа — это встроенная система (ARM), в которой GPU и CPU делят память, поэтому теоретически я мог бы сделать это без какой-либо копии. Выбранная платформа поддерживает OpenGL 2.1 и OpenGL ES 3.0.
Я понимаю, что объекты буфера могут быть сопоставлены с помощью glMapBufferRange(). Я рассмотрел следующие возможности:
UNIFORM_BUFFER: слишком мал для хранения полноэкранного изображения.
SHADER_STORAGE_BUFFER: поддерживается только с ES 3.1
Хранилище загрузки изображений шейдеров: поддерживается только начиная с ES 3.1.
Текстура буфера: ES 3.0 не поддерживает (поддерживается с ??)
Объекты пиксельного буфера: я не могу добраться до них из шейдеров, и мне кажется, что он действительно копирует, когда я обновляю из него текстуру. Я не знаю, быстрее ли это, чем копирование из памяти клиента (учитывая, что все они находятся на одном чипе ОЗУ :))
простые текстуры: не являются буферными объектами, не могут быть отображены в памяти клиентского процесса
Я что-то пропустил? В ES 3.0 нет возможности совместно использовать буфер с графическим процессором, содержащий огромное количество данных, которые я могу записывать из процессора и читать из фрагментных шейдеров?