Как лучше всего получить доступ к видеокадру ARCore в вычислительном шейдере - PullRequest
0 голосов
/ 15 апреля 2020

Я внедряю технологию, использующую ARCore (в настоящее время 1.16.0), а также пользовательскую обработку изображений в вычислительных шейдерах OpenGL ES 3.2.

Есть два способа получить доступ к видеокадру из вычислительных шейдеров оба имеют недостатки:

  1. Использование Session.setCameraTextureName(). Это кажется естественным вариантом, поскольку я позволяю ARCore получать данные в текстуру OpenGL для себя. Однако это в RGBA, что, вероятно, означает, что перед получением данных происходит нежелательное преобразование с потерями. Кроме того, поскольку это текстура GL_TEXTURE_EXTERNAL_OES , я не могу получить доступ к пикселям напрямую (используя imageLoad()), и мне приходится go через сэмплер. Кроме того, на устройствах, которые я тестировал, разрешение текстур составляет 1080 для каждого CameraConfig, что слишком много для моего алгоритма вычислений, требующего уменьшения масштаба.
  2. Использование Frame.acquireCameraImage(). Плюсы в том, что я получаю изображения в YCbCr, по-видимому, пропуская шаг преобразования с потерями, и что я могу выбрать подходящее разрешение. Недостаток в том, что мне нужно совершить два glTexSubImage2D() вызова.

(Кстати, на Samsung S8 и A3 разрешение текстур для всех конфигов составляет 1920x1080, а разрешения изображений - 640x480, 1280x720 и 1920x1080. .)

Кажется, что ARCore + compute - это немного серой области. Любые предложения о том, какой вариант лучше, приветствуются, но, пожалуйста, приведите источники. :)

РЕДАКТИРОВАТЬ: Добавление некоторых конкретных вопросов на основе обратной связи:

  • Какой путь обычно используется за кулисами к go от изображения YCbCr в основной памяти до текстуры RGBA OpenGL ES ?
  • Является ли этот путь быстрее, чем glTexSubImage2D()?
  • Заплачиваю ли я вычислительные расходы за это независимо от того, задаю ли я имя текстуры сеанса?
  • YCbCr-образ основной памяти всегда предшествует текстуре RGBA в цепочке преобразования?

1 Ответ

1 голос
/ 22 апреля 2020

Какой путь обычно используется за кулисами к go от изображения YCbCr в основной памяти до текстуры RGBA OpenGL ES?

Использование GL_TEXTURE_EXTERNAL_OES в основном означает доступ с нулевым копированием. Графический процессор может напрямую обращаться к изображению YUV, записанному камерой / видеоблоком. Преобразование цветов происходит на лету; при этом могут возникнуть некоторые проблемы с GPU - это будет зависеть от аппаратного обеспечения - но в памяти не создается вторая копия RGB. Сколько накладных расходов - современные мобильные графические процессоры могут сделать это очень эффективно, но более старые могут иметь в 2 раза большую стоимость текстурирования для двух плоскостей YUV.

Этот путь быстрее, чем glTexSubImage2D ()?

В общем, да, поэтому существует прямой путь доступа. Однако тот факт, что вам придется вводить дополнительную понижающую дискретизацию в одном случае, а не в другом, не делает это очевидным «правильным ответом».

Также обратите внимание, что стоимость отличается. Прямое преобразование YUV-RGB влечет за собой затраты на GPU. Загрузка текстур требует затрат процессора. В зависимости от относительной производительности CPU / GPU вашего устройства и от того, какие ресурсы использует остальная часть вашего приложения, одно из них может быть менее болезненным, чем другое.

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

Нет. Преобразование YUV-в-RGB выполняется в сэмплере при доступе к текстуре.

Всегда ли образ основной памяти YCbCr предшествует текстуре RGBA в цепочке преобразования?

Текстура RGBA полностью виртуальна - ее нет в памяти .

разрешение текстур для всех конфигов составляет 1920x1080, а разрешения изображений 640x480, 1280x720 и 1920x1080.

Обратите внимание, что существует множество спецификаций поставщика c "волхвы c" в слое HAL камеры. Невозможно сказать, как создаются изображения с более низким разрешением; они могут быть сгенерированы с более низким разрешением непосредственно камерой, или они могут быть уменьшены в отдельном проходе HAL поставщика (обычно с использованием аппаратного масштабатора, если камера не может сделать это напрямую).

...