Cum să definiți zone transparente ale unui sprite folosind o mască

  • C ++
  • Dezvoltarea jocurilor

Avem două imagini:
sursă, cu un fundal negru:
și masca lui, cu un fundal alb:

Am nevoie de:
Obțineți transparență, astfel încât, în cazul contururi negre sprite, acestea sunt afișate în loc de fundal negru. Pentru că, dacă faci hromakey simplu pe un fundal negru, contururile vor fi, de asemenea, transparente. Este cunoscut faptul că puteți ieși din situația prin tragere contururile un pic mai ușoare decât negru (de exemplu, fundal # 000000 și # 000001 contururi), dar nu este potrivit, deoarece proiectul este programat pentru sprite personalizate. Transparența ar trebui să fie arătat exact unde masca pe un fond alb coincide cu un fundal negru pe original.
+ =

Nu este nevoie de un canal alfa.
Folosesc biblioteca SDL pentru C ++.
________________________________________________________________________

Deși există o ipoteză:
Culoarea pe masca: trebuie să scadă culoarea din canalul alfa pixelului corespunzător din fiecare imagine, dar pe software-ul de test au văzut că, dacă masca nu este primit culoarea neagră, începe să se amestece cu fundalul și pentru a obține murdăria:

Experimentul în software-ul investigat, cu o mască greșită:
Sursă și mască:

Cum să definiți zone transparente ale unui sprite folosind o mască

UPD: După un timp, am aflat ce tip de algoritm folosesc de fapt desenul unor astfel de imagini:

Pentru aceasta, a fost utilizat algoritmul de mască de biți.

adică:
  • Mai întâi, este desenată o mască cu un bit pixel-pixel bitwise cu pixeli de ecran.
  • Apoi, în același loc, imaginea însăși este desenată, dar cu bitul OR pixel-cu-pixel cu pixeli de ecran

Un astfel de algoritm a fost folosit în programul investigat pentru motivul că VisualBasic 6, pe care acesta a fost scris, nu susținea în mod regulat canalul alfa și redarea de imagini transparente. De ce, chiar și în câteva exemple și tutoriale, a fost folosită această metodă. În motorul meu, folosesc imagini PNG, iar cele vechi sunt amestecate cu fondul gri, atribuind un canal alfa, în funcție de suma pixelilor mască și de imaginea în sine.

Deci, este posibil să se utilizeze masca ca un canal alfa inversat, dar în cazul în care masca este greșit (utilizatorii vechiul motor de multe ori a făcut „leneș“ masca - copiat imaginea în sine, doar fundal golf alb), imaginea este un translucide diferite niveluri ale curbei (care este strict necesită utilizarea unei măști corecte). Ca rezultat, când am făcut convertorul de imagini cu măști în PNG. la fel ca și utilitatea, care stabilește automat măștile "leneșe".