- C ++
- Розробка ігор
У нас є два зображення:
вихідне, з чорним фоном:
і його маска, з білим фоном:
Мені потрібно:
Отримати замість чорного фону прозорість так, щоб в разі чорних контурів у спрайту, вони відображалися. Тому що, якщо виконувати просто хромакей по чорному фону, то контури теж будуть прозорими. Відомо, що можна вийти з ситуації малюванням контурів ЛЕДЬ-світлішим, ніж чорним (наприклад, фон # 000000 а контури # 000001), але це не підходить, тому проект планується для призначених для користувача спрайтів. Прозорість повинна проявлятися саме там, де на масці білий фон збігається з чорним фоном на оригіналі.
+ =
В альфа-каналі немає необхідності.
Використовую для роботи бібліотеку SDL на С ++.
________________________________________________________________________
Хоча є припущення:
Колір на масці: повинен віднімати колір з альфа-каналу відповідного пікселя на кожному зображенні, але на досліджуваному ПО бачив, що якщо під маску потрапляють не чорний колір, він починає змішуватися з фоном і виходить бруд:
Експеримент в досліджуваному ПО з неправильною маскою:
Исходник і маска:
UPD: Через деякий час з'ясував, якою насправді застосовується алгоритм малювання таких зображень:
Для цього використовувався алгоритм бітової маски.
т.е .:- Спочатку отрісовивается маска з побітовим "І" попиксельно з екранними пікселями.
- Потім в тому ж місці отрісовивется сама картинка, але з побітовим АБО попиксельно з екранними пікселями
Такий алгоритм застосовувався в досліджуваній програмі з тієї причини, що VisualBasic 6, на якому вона була написана, штатно не підтримував альфа-канал і отрисовку прозорих зображень. Чому навіть в деяких прикладах і туторіали застосовувався саме цей метод. У своєму движку я застосовую PNG-картинки, а старі перетворю змішуючи з сірим фоном, призначаючи альфа-канал в залежності від суми пікселів маски і самої картинки.
Так-же можна застосовувати маску в якості інвертованого альфа-каналу, однак якщо маска неправильна (користувачі старого движка дуже часто робили "ледачі" маски - скопіювали саму картинку, просто затоку фон білим), то картинка виходить кривої з напівпрозорого різного рівня (що суворо вимагає використання правильної маски). У підсумку коли я зробив конвертер зображень з масками в PNG. так само зробив і утиліту, яка фікс "ледачі" маски автоматично.