Game Maker – blend mode

Myslel jsem si, že blend mode celkem ovládám. Nedávné události mi však rázně vysvětlili, že to tak není ani náhodnou. Dlouho jsem tedy hledal vysvětlení a nakonec jsem jej nalezl. Myslím, že většina lidí blend mode moc nerozumí a proto bych zde chtěl popsat, co jsem zjistil. Nakonec, dají se s tím dělat hodně pěkné věci. 🙂

Něco málo o blend modech je k nalezení v samotné nápovědě Game Makeru, to je ale bohužel vysvětlení, které tomu, kdo neví o co jde, neřekne vůbec nic (nebo jsem prostě blbej :p ).

Je tam přibližně napsáno, že blend mode udává, jak se má zacházet s hodnotami (R, G, B, A) pixelu v pozadí – dest (to, co už je vykreslené) a v obrázku – src (to co budeme přikreslovat), který na něj kreslíme. O tom, jak to ty hodnoty vypočítává, tam je ale velký kulový. 🙁

Inu, vypočítává se to takto:

Př.:draw_set_blend_mode(bm_src_alpha, bm_inv_src_alpha);//tohle je stejné jako bm_normal

– pozadí (dest) má tyto např. hodnoty: Rd=0.5;Gd=0.2;Bd=0.8;Ad=1;

– obrázek (src) má tyto např. hodnoty: Rs=0.2;Gs=0.4;Bs=0.2;As=0.3;

 

– hodnoty R, G, B, A (všechny tyto hodnoty jsou v rozsahu 0.0 až 1.0) se nejprve násobí hodnotami určenými blend modem 

dest: máme zde bm_inv_src_alpha, který všem hodnotám přiřazuje

1-As (hodnota průhlednosti u src – obrázku), proto:

Rd = 0.5*(1-As) = 0.5*(1-0.3) = 0.5*0.7 = 0.35;

Gd = 0.2*(1-As) = 0.14;

Bd = 0.8*(1-As) = 0.56;

Ad = 1*(1-As) = 0.7;

src: máme zde bm_src_alpha, který všem hodnotám přiřazuje hodnotu As, proto:

Rs = 0.2*As = 0.2*(0.3)  = 0.06;

Gs = 0.4*As = 0.12;

Bs = 0.2*As = 0.06;

As = 0.3*As = 0.09;

 

– nakonec se již upravené hodnoty u src a dest sečtou a máme výslednou barvu

Rd = Rd+Rs = 0.41;

Gd = Gd+Gs = 0.26;

Bd = Bd+Bs = 0.62;

Ad = Ad+As = 0.79; => 1.0 (u surface by zůstalo 0.79)

Tohle je vlastně výsledek, ale:

 – pokud nevykreslujete do surface, v dest nemůže být jiná hodnota u A než 1 (těžko uděláte průhledný monitor 🙂 ), takže se prostě nastaví na 1

 

– pokud nějaká hodnota přesáhne 1, bude nastavena na 1

 

– hodnota v bytu (0 až 255) se zaokrouhluje vždy dolu, takže např. 0.41*255=104.55, budeme tedy mít 104

 

– při násobení hodnot se vždy bere v potaz původní (nenásobená blend modem) hodnota

V našem příkladu jsem jako první násobil dest, což nám zrovna nevadí, ale pokud bych nejprve násobil src, hodnoty se u src změní, takže logicky bych pak u násobení dest použil např. u As místo 0.3 hodnotu 0.09. To by bylo ovšem špatně, nové hodnoty jsou uloženy až po sečtení do dest. Předtím se zkrátka hodnoty nemění a to ani u dest. Pouze se předpočítají a uloží někam jinam (src – vykreslovaný sprite – se rozhodně nezmění).

 

Graficky pak příklad vypadá takto:

blend

Vypočítával jsem hodnoty pro fialový čtverec. Pro bílou by byla v dest u všech barev hodnota 1.

U všech ostatních blend modů to funguje naprosto stejně, jen se násobí jinými hodnotami. Jakými hodnotami najdete v tabulce, kterou najdete v nápovědě GM (viz odkaz nahoře).

 

Doufám, že je to alespoň trochu pochopitelné. 🙂