Альтернативы смешивания Флойда-Штейнберга для пиксельного шейдера
Я знаю, что Флойда–Стейнберга сглаживание алгоритм не может быть реализован с помощью пиксельного шейдера, потому что этот алгоритм строго последователен. Но, может быть, существует какой-то высоко параллельный алгоритм смешивания, который по визуальному выходу похож на алгоритм Флойда-Штейнберга ?
Итак, вопрос в том, какие алгоритмы сглаживания подходят для реализации на пиксельном шейдере (предпочтительно GLSL) и с качеством вывода (очень) похожи на сглаживание Флойда-Штейнберга ?
кстати. Многопроходные алгоритмы разрешены до тех пор, пока не будет не более 2 проходов, а накладные расходы процессора между этими проходами невелики.
какие идеи ?
EDIT:
мне нужно колебаться от 24-битного цвета до 21-битного цвета.
(то есть - мне нужно преобразовать из 8 бит/канал 7 бит/канал.)
EDIT 2
Возможно, я не очень хорошо объяснил проблему. Поэтому я попытаюсь немного расширить проблему.
Проблема это-рассмотрим у нас такую картину:
и у нас есть выше изображение, но обрабатывается с алгоритмом dithering:
теперь это процедура, которая проверит ваше колебание хорошо для меня или нет:
1. Загрузите эти фотографии в Photoshop как одно изображение с 2 слоями.
2. Выберите режим наложения слоев в "Difference".
3. Выполните операцию "слияние видимых" слоев, чтобы получить только один слой.
4. Выполнять операции>= Изображение / Корректировки / Выравнивание
после этого вы должны получить такое изображение:
как вы видите - средние пиксели, которые были в монотонном красном цвете, не колебались вообще.
Также немного отличается смешивание левой и правой зон изображения. Попробуйте реконструировать алгоритм смешивания с таким поведением.
2 ответов
Если вы уменьшаете с 8 бит до 7, вы отбрасываете почти никакой информации. Вы уверены, что вам даже нужно dither?
Если вам нужно dither, добавьте случайный шум, а затем клип, это будет очень хорошо для вашего приложения.
можно использовать приказал dither. Это более грубый вид, чем Floyd-Steinberg, но нет никакой зависимости между пикселями.
Edit: поскольку вы удаляете только один бит, это становится почти тривиальным. Принцип упорядоченного dither заключается в создании шаблона, который смещает порог перехода; в этом случае смещение будет 0 или 1, а шаблон будет 2x2 пикселей. Эти два изменения вместе сделают шаблон гораздо менее неприятным чем в статье Википедии - вам может понравиться даже лучше, чем Флойд-Стейнберг.
вот какой-то псевдокод:
bias = (X xor Y) and 0x01
value = pixel + bias
if value > 255: value = 255
pixel = value and 0x7e
Edit 2: вот мой результат разницы, насколько я могу это сделать. Не зная, как вы сопоставляете свои 7-битные значения с 8 битами, я не могу сделать лучше.