2017-01-15 3 views
1

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

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

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

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

  • UNIFORM_BUFFER: слишком мал, чтобы хранить полноэкранное изображение с

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

  • Shader Image Load Store: поддерживается только от ES 3.1

  • буфера текстуры: ES 3.0 не поддерживает (поддерживается ??)

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

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

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

ответ

0

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