Как сделать пиксели с определенным диапазоном RGB прозрачными - PullRequest
0 голосов
/ 06 мая 2018

У меня фиксированный размер frame buffer (1200x720 RGBA, эффективно преобразованный из YUV) в массив байтов Java.

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

В настоящее время я делаю это с помощью процессора, обходя массив байтов и обнуляя пиксель, если RGB > 0xC8. Это несколько работает, но, очевидно, очень медленно (> 1 сек / кадр) для этого в прямом эфире.

Я исследовал способы сделать это с помощью GPU/OpenGL на Android, и я вижу упоминания об альфа-тестировании, смешивании и цветовом наборе. Кажется, что альфа-тест здесь бесполезен, поскольку он опирается на альфа-информацию, а не на значения RGB.

Есть идеи, как сделать это на Android с помощью OpenGL / Java?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Кажется, что альфа-тест здесь бесполезен

Логика для альфа-теста реализована в фрагментном шейдере, поэтому вместо тестирования альфа-теста просто измените тест, чтобы реализовать проверку значения RGB. Техника здесь универсальна и на 100% гибка. Основная операция, которую вы ищете, это фрагментные шейдеры, которые запускают операцию discard при совпадении цветовой клавиши.

В качестве альтернативы вы можете использовать ту же условную проверку, но вместо того, чтобы вызывать discard, просто установите выходной цвет на vec4(0.0) и используйте смешивание, чтобы избежать изменения кадрового буфера для этого фрагмента. В целом я ожидал бы, что это будет более эффективным; discard имеет тенденцию иметь странные побочные эффекты производительности.

0 голосов
/ 06 мая 2018

Вы должны создать собственный скрипт рендеринга для преобразования этих пикселей, вы также можете использовать его для преобразования из yuv, чтобы обрабатывать пиксели в буфере только один раз

...