Stránka 1 z 1

Simulácia alpha-masky

Napsal: září 16, 2012, 12:14 am
od ipq
Ahojte, v poslednej dobe to ide so mnou biedne čo aj vysvetľuje, prečo už toho sem moc nedávam ale keď niečo vynájdem ako Tesla(i keď už iný s tým môže byť vopred), tak si to nenechám len pre seba ako nedokážem to dlho nechávať si, čo môže byť užitočné aj pre ostatných.
Chcel som pôvodne sem dať i ako robiť plošinovské kolízie s 80-tých rokov ale zrejme zabudol som, tak toto je provizorná náhrada.

Vysvetlivka
O čo ide? Začal som sa znovu venovať retro veciam resp. tomu ako sa dalo v minulosti dosiahnuť efektu, že sa zobrazí 2D obraz s alpha maskou, vtedy v starých rokoch vôbec nebývali žiadne nejaké obrázkové súbory, ktoré by preferovali alpha kanál. Až neskôr sa začal popularizovať PNG formát, v ktorom potom bolo implementované RGBA(A ako alpha kanál). Ale v tej dobe niektoré počítače alebo hracie konzole vôbec také obrázky nepodporovali ale zato miesto toho mali podporu blendov. Blendy sa používali ako náhrada efektov jak v 2D hrách, tak i v 3D hrách, dokým ich nenahradili shadery. Už 16-bitové konzole ako je Sega Genesis(známa ako Sega Mega Drive) alebo SNES konzola malo podporu aditívneho a subtraktívneho miešania farieb za pomocí toho už bolo možné spraviť simuláciu. Tak tiež i 32-bitové/64-bitové konzoly ako je Playstation série, N64, Xbox a Gamecube ich tiež podporovali ale už v pokročilejšom systéme.

Funkčnosť
Stačí za pomoci dvoch blendov(aditivný a subtraktivný) u každého vykresliť obrázok. Ale najprv je potreba rozdeliť obrázok, ktorý obsahuje alpha kanál, na dva(jeden normálny ale bez alpha masky nahradeným čiernym pozadím a druhý ako alpha maska).

Príklad nám poslúži tento obrázok:
Obrázek
[zdroj: Foxkeh.jp/Foxkeh.com]

Najprv si vytvoríme prvú kópiu toho obrázku ale miesto priehľadného miesta bude to nahradené čiernym pozadím.
Obrázek
Potom si spravíme druhú kópiu toho obrázku ale to bude obsahovať len obrázok alpha masky, ktorá tam je.
Obrázek
Poznámka: Game Maker pri subtraktívnom blende invertuje paletu farieb!

U Game Makeru stačí vo drawe vložiť tento script:

Kód: Vybrat vše

draw_set_blend_mode(bm_subtract);
//obrazok s alpha maskou
draw_sprite(spr_alpha,0,x,y);
draw_set_blend_mode(bm_add);
//obrázok s čierným pozadím
draw_sprite(spr_image,0,x,y);
//deaktivácia blednu
draw_set_blend_mode(bm_normal);
Výsledkom by malo byť toto:
Obrázek
Pokiaľ si s tým neviete rady, môžem aj dodať príklad!

Využitie
Úprimne, takmer nepoužiteľné. Maximálne sa to dá využiť napr. v GoldSource Enginu, pretože ten alpha-masku nepodporuje ale blendy áno(i keď rozšíriteľné doplnky už existujú) a najviac moderné Enginy už majú podporu alpha-masky. I Game Maker už podporoval alpha-masku tuším od štvorky ale bolo potreba obraz i s informáciou alpha-masky rozdeliť a za pomocí draw_sprite_alpha vykresliť(malo to podporu i priehľadnosti). Úprimne v starých verziach to bolo(i s priehľadnosťou) totálne náročne na výkon tím že o vykresľovanie sa staralo len softwarové vykresľovanie, do 6 verzie to bolo nahradené scriptami, ktoré to skompostujú do jedného, od 7 boli pridané scripty pre načítavanie PNG i TGA obrázkov(áno i TGA podporovali aplha-masku a DDS tiež). GM8 už dostal natívnu podporu.

Takže aký je výsledok, na normálne využitie obrázkov to nemá ale napr. na surface by sa to ešte dalo ako je klasický transparent alebo kompletný prechod ale nemám to otestované.

Re: Simulácia alpha-masky

Napsal: září 11, 2013, 3:42 pm
od BboyScary
vysvětlené to je snad dobře ale když se dívám na obrázky tak jsou úplně stejné. Nevím čeho se má docílit ve výsledném obrázku když je stejný jako origoš.

Re: Simulácia alpha-masky

Napsal: září 11, 2013, 5:19 pm
od Nichar
Obrázky jsou sice stejné, ale tady jde o pozadí. Všimni si ocasu, který má průhlednou auru kolem sebe. Na pozadí působí přirozeně. Stejného efektu lze už snadněji dosáhnout v GM8 a výš...

Tohle byl jediný tvůj důvod pro otevření rok starého topicu?

Re: Simulácia alpha-masky

Napsal: září 24, 2013, 9:56 am
od BboyScary
ne důvod spíš jsem si toho dříve nevšiml a když jsem se teď díval nepochopil jsem. Ale dík za vysvětlení už vím o co jde :)