Unity3d - удалить белый фон с изображения во время выполнения

Я работаю над приложением единства для детей.

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

Проблема в белом фоне. Как я могу динамически изменить белую часть на прозрачную? Я играл с текущими шейдерами в Unity и заметил, что если я импортирую изображение с белым фоном вручную и назначаю шейдер типа "Частицы / умножение", белая часть удаляется, но изображение также выглядит темнее, чем должно вроде цвета не совсем правильные. Как я могу сделать это с кодом во время выполнения? а также это единственный способ? потому что я не хочу, чтобы изображение теряло цвет.

Короче говоря, как мне удалить белый фон динамически? Также стоит упомянуть, что следует удалить только внешний фон, поэтому, если у рыбы есть, например, белые глаза, она не должна превращаться в прозрачную. поэтому обнаружение внешней части также является частью проблемы для меня.

заранее спасибо

Изменить: я начал играть с различными шейдерами и шейдерным кодом, и немного прогрессировал. Поэтому я импортировал спрайт, добавил в него несколько спрайтеров по умолчанию и в код шейдера добавил следующую строку: Blend Zero SrcColor Как видно на прикрепленном изображении, он производит необходимый эффект удаления белого фона. Единственная проблема, теперь рыба тоже немного прозрачна. Все, что я хочу сделать, это сохранить рыбу нормальной, как на левом изображении, но убрать фон, как на правом!

Изображение: использование смешивания на спрайт-шейдере

0 ответов

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

Один из вариантов - добавить это к функции фрагмента или поверхности:

clip(_Threshold - col.r*col.g*col.b)

Это предполагает, что _Threshold - это свойство со значением, близким к 1 (чем ниже, тем больше серых цветов станет прозрачным), а col - это цвет альбедо.

Вы также можете попытаться преобразовать "белизну" в альфу с помощью математической магии. Вот пример:

col.a = floor(saturate(col.r*col.b*col.g + (1-_Threshold)))

Или вот так:

col.a = saturate(pow(col.r*col.b*col.g + (1 - _Threshold), 10))

Обходным решением будет иметь белый фон, но изменяемая текстура всегда прозрачна, поэтому вы добавляете цвет к прозрачной текстуре, а другой объект - просто фон.

Не так ли?

Другие вопросы по тегам