.[ ČeskéHry.cz ].
Vrstvy a průhlednost v XNA.

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> .NET
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
michaldawn



Založen: 26. 02. 2008
Příspěvky: 6
Bydliště: Brno

PříspěvekZaslal: 26. únor 2008, 15:47:39    Předmět: Vrstvy a průhlednost v XNA. Odpovědět s citátem

Dobrý den. Chtel jsem se zeptat na par informaci ohledne vrstev a pruhlednosti v XNA. Nez bych slozite formuloval otazku, zkusim popsat nazorny priklad Wink

Mam dve vrstvy. Jednu pouziji na nejaky podkladovy obrazek. Do druhe vrstvy vlozim jiny obrazek, ktery slouzi pouze k definici pruhlednosti. Takze dejme tomu, ze prvni vrstvu lehce zatemnim druhou vrstvou. Podkladovy obrazek muze byt klidne BMP nebo JPG vez pruhlednosti, druha vrstva obsahuje obrazek PNG i s definovanou pruhlednosti.

A ted ten trik. Rad bych do druhe vrstvy vlozil nejaky maly obrazek (treba kolecko), ktery by upravoval pruhlednost druhe vrstvy, takze by byl podkladovy obrazek v prvni vrstve zobrazen bez zastineni druhou vrstvou. Hlavni problem (pro me) spociva v tom, jak zaroven neovlivnit (tim malym koleckem) prvni vrstvu, ale pouze tu druhou.

Snad to bude jasne z obrazku:
1) výchozí obrázek

2) spravny prurez pres druhou vrstvu bez ovlivneni barvy a svetlosti prvni vrstvy.

3) Spatne reseni. Prurez neni prurezem, pouze osvetlil zastinenou cast prvniho obrazku (v podstate smichane tri vrstvy)


Diky vsem za tipy Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 26. únor 2008, 16:15:00    Předmět: Odpovědět s citátem

No hele, přečetl jsem si to pětkrát a vůbec nechápu, čeho chceš dosáhnout (a to jsem imho v XNA a DirectX docela zběhlý). XNA nezná pojem vrstvy a umisťování obrázků do vrstev. Co zkusit ten Tvůj požadavek vyjádřit matematicky/algoritmicky? Používej značení podobně jako v shaderech, pak to každý pochopí (podklad.RGB, druhyObrazek.A apod.).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
juroo



Založen: 28. 07. 2007
Příspěvky: 28

PříspěvekZaslal: 26. únor 2008, 20:07:53    Předmět: Odpovědět s citátem

suhlas s Augim - nechapacky... neviem o co ti vlastne ide ale v XNA na tieto veci funkcie a triedy su, takze tvoj problem (nech je uz akykolvek) vyriesit urcite pojde. Skus upresnit (aby sme to pobrali) o co vlastne ide alebo proste hladaj (MSDN, google, ..) ludi co podobne veci riesili je kvantum, manual je tiez dost intuitivny. Precitaj si toto:
http://blogs.msdn.com/etayrien/archive/2006/12/07/alpha-blending-part-1.aspx
http://blogs.msdn.com/etayrien/archive/2006/12/12/alpha-blending-part-2.aspx
http://blogs.msdn.com/etayrien/archive/2006/12/19/alpha-blending-part-3.aspx
je dost mozne, ze tam najdes co hladas
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Mem



Založen: 28. 07. 2007
Příspěvky: 1959
Bydliště: Olomouc

PříspěvekZaslal: 26. únor 2008, 20:38:17    Předmět: Odpovědět s citátem

No o co mu jde je přece jasně vidět na tom druhém obrázku - v kruhové výseči chce vidět originál obrázek, a vše okolo chce mít ztmavené (třeba jako pohled přes dalekohled nebo tak něco). A ptá se tedy asi na to, jak implementovat tu masku, kterou by mohl dynamicky na ten obrázek aplikovat, a zřejmě na tom třetím obrázku zkoušel jen blendovat černobílý obrázek, takže mu sice černá ztmavila okolí, ale bílá zároveň zesvětlila ten kruh. Takže by imho měla stačit černá bitmapa s alpha maskou, kde pro ten kruh udělá díru a pro zbytek třeba polovčiní alphu
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 26. únor 2008, 21:27:26    Předmět: Odpovědět s citátem

Jj přesně jak říká Mem.

Udělá si zvlášť texturu pro druhou vrstvu, kde RGB bude černé a alpha bude cca na 0.6 (čím vyšší, tím víc se to ztmaví). Potom do té textury vyrenderuje černé kolečko, které by mělo mít alphu na 0 (případně ho může na okraji blurnout v editoru, aby byl přechod hladký), tím zprůhlední tu tmavou. Technicky je jedno, jestli to kolečko bude černé nebo ne, protože bude celé průhledné, ale kvůli tomu bluru je dobré zachovat stejnou barvu jako měl podklad té druhé vrstvy (tedy textury). Výsledná scéna bude pak vypadat tak, že jednoduše vykreslí první vrstvu a na to s alphablendingem tu druhou (jako texturu).
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
juroo



Založen: 28. 07. 2007
Příspěvky: 28

PříspěvekZaslal: 26. únor 2008, 21:42:02    Předmět: Odpovědět s citátem

ahaa, tak uz mi je to jasne. Mem to pekne ozrejmil a Eo dal rovno navod, takze vec je myslim vyriesena Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Mem



Založen: 28. 07. 2007
Příspěvky: 1959
Bydliště: Olomouc

PříspěvekZaslal: 27. únor 2008, 07:50:26    Předmět: Odpovědět s citátem

juroo: Já bych jen upřesnil, že už já jsem podal návod s alphou a Egosie jej rozepsal do detailů, ale nebudeme slovíčkařit u takového pěkného tématu Wink
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
michaldawn



Založen: 26. 02. 2008
Příspěvky: 6
Bydliště: Brno

PříspěvekZaslal: 28. únor 2008, 09:13:50    Předmět: Odpovědět s citátem

Very Happy Díky kluci, jste blizko Wink Problém je, ze podkladovy obrazek (obr1.) mam jiz namalovany, a tu cernou plochu take (to stmaveni). Ve vyse uvecenem priklade sice ta tmava plocha zakryva celou plochu prvniho obrazku, ale je klidne mozne, ze to ztmaveni bude mit nejaky tvar. Takze i to ztmaveni je uz namalovany obrazek s definovanou pruhlednosti a je pevne sprazen s obrazkem prvnim. Zatim co to kolecko je nový objekt, který jakoby "vymazaval" tu druhou vrastvu.

Zkusim uvest jeste jeden konkretnejsi priklad. (jen tak mimochodem - cele to je to vykreslovano pomoci SpriteBatch a ten ma "layers" - tedy predpokladam vrstvy a jde mi jen o 2D).

takže ten priklad...
Prvni vrastva bude nejaka mapa ulice z pohledu seshora (treba jako v GTA2). Druhou vrstvu pouziji k definovani prirozeneho osvetleni prostredi. V podstate stiny budov nebo nejake temne zakouti. No a pak vykreslim postavicku hrace, ktery si sviti baterkou. To svetlo te baterky by melo v podstate ve svem dosahu svetla zpruhlednovat druhou vrstvu.

Vcera jsem nemel pristup na net, tak sry za pozdni reakci... jeste jednou diky a tesim se na vase reakce.. Wink
_________________
Squadra Moravia
http://www.dvorakmichal.eu - osobní stránky
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 28. únor 2008, 11:37:17    Předmět: Odpovědět s citátem

Já věděl, že to nebude tak jednoduchý, jak si myslel Mem Wink Ale teď už snad chápu, čeho chceš dosáhnout. "Matematicky" by to šlo vyjádřit jako "(osvětlení or baterka) and pozadí", pokud logické jedničce odpovídá hodnota "osvětleno".

Kdybys vykresloval ty sprity sám, tak bych Ti poradil, jak správně nastavit texturovací jednotky (což ale vlastně v XNA nejde, takže spíš napsat shadery), aby jsi dosáhl správného výsledku (a pomalý alpha-blending by vůbec nebyl potřeba).

Pokud budeš teda chtít použít ale SpriteBatch, tak bys měl:
1) Vykreslit vrstvu s osvětlením (prostě natvrdo ji vykreslit bez jakýchkoliv alpha-blendů apod.).
2) Dále bys měl vykreslit vrstvu s baterkou (alpha bude po celém obrázku rovna jedné) - při tomto použiješ SpriteBlendMode.Additive, čímž zajistíš, že se Ti textura s osvětlením a baterkou sečtou, takže výsledkem bude obraz v back-bufferu, který bude obsahovat bílá místa, kde je světlo a černá místa, kde je tma ("osvětlení or baterka").
3) Nyní tedy máme "osvětlení or baterka" a my bychom potřebovali to vyandovat s pozadím. Protože SpriteBatch umožňuje jen AlphaBlend a Additive, použijeme první z nich: SpriteBlendMode.AlphaBlend. Vykreslíš pozadí, které bude mít v alphě takovou hodnotu, která bude udávat, jak moc je celkově světlo intenzivní. Tím ale dosáhneme pěknýho hnusu, takže co jsem psal doteď je nepoužitelné, protože SpriteBatch je dost omezující.

Takže jinak:
1) Vytvoříš si texturu, která bude stejně velká jako obrazovka a bude obsahovat i alpha kanál.
2) Natvrdo vykreslíš texturu osvětlení do této textury. Textura osvětlení by měla v alpha kanálu obsahovat malou hodnotu pro neosvětlené oblasti a velkou hodnotu pro osvětlené oblasti.
3) Nyní bysme potřebovali udělat nějaký "or". Takže vykreslíš do textury (z bodu 1)) texturu baterky se SpriteBlendMode.Additive. Textura baterky by měla mít opět alphu malou v oblastech, kam nesvítí, a velkou v místech, kam svítí.
4) Nyní tedy máme v alpha kanálu textury z bodu 1) informaci o tom, jak hodně má být dané místo osvětleno.
5) Do back-bufferu si vykreslíš pozadí.
6) Vykreslíš pomocí SpriteBlendMode.AlphaBlend texturu z bodu 1).
Kdybys použil jako "velkou hodnotu" v osvětlovacích texturách něco blízké 1, dostal bys pro osvětlená místa bílé plochy a pro neosvětlená místa naopak původní pozadí, takže co jsem napsal je opět k ničemu. Prostě nasrat na SpriteBatch - je to hrozně omezující Smile

No ne, tak ještě jeden pokus:
1) Vytvoříš si texturu, která bude stejně velká jako obrazovka a bude obsahovat i alpha kanál.
2) Natvrdo vykreslíš texturu osvětlení do této textury. Textura osvětlení by měla v alpha kanálu obsahovat velkou hodnotu pro neosvětlené oblasti a malou hodnotu pro osvětlené oblasti (rozdíl oproti předchozí verzi).
3) Nyní potřebujeme zajistit, aby po vykreslení textury baterky byla alpha malá (tedy osvětleno) tam, kde je buď textura osvětlení nebo textura baterky malá. Tzn., že použijeme SpriteBlendMode.AlphaBlend pro vykreslení textury baterky do textury z bodu 1).
4) Nyní tedy máme v alpha kanálu textury z bodu 1) informaci o tom, jak hodně má být dané místo osvětleno (malá alpha) nebo neosvětleno (velká alpha).
5) Do back-bufferu si vykreslíš pozadí (natvrdo, žádnej alpha-blend apod.).
6) Vykreslíš pomocí SpriteBlendMode.AlphaBlend texturu z bodu 1).
Kdybys použil jako "velkou hodnotu" v osvětlovacích texturách něco blízké 1, dostal bys pro neosvětlená místa černé plochy, takže tu "velkou hodnotu" bych trošku stáhl, aby bylo aspoň trošku vidět pozadí. RGB osvětlovacích textur by tedy měla být furt černá.
Pokud bys použil jako "malou hodnotu" v osvětlovacích texturách neco blízké nule, dostal bys pro osvětlená místa původní pozadí, což je ok. Takže výsledek by mohl snad být v rámci možností relativně ok.

Takhle by to teda snad mělo fungovat. Aspoň vidíte, jakej jsem blb, že mi to tak dlouho trvá, než to správně vymyslim Smile Teda snad správně, radši to po mně někdo překontrolujte Wink Jinak v shaderu by to bylo na pár řádek a mnohem efektivnější Wink Pokud by neexistovala textura baterky, ale baterka se vykreslovala např. pomocí pár trojúhelníčků (jak předpokládal Egosie), tak by se to taky docela zjednodušilo - už jenom proto, že by se nepoužíval SpriteBatch a mohli bysme si tedy nastavit blending přesně podle vlastních potřeb.

Jinak o blendingu v XNA jsem našel tohle povídání:
http://blogs.msdn.com/etayrien/archive/2006/12/07/alpha-blending-part-1.aspx
http://blogs.msdn.com/etayrien/archive/2006/12/12/alpha-blending-part-2.aspx
http://blogs.msdn.com/etayrien/archive/2006/12/19/alpha-blending-part-3.aspx
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
michaldawn



Založen: 26. 02. 2008
Příspěvky: 6
Bydliště: Brno

PříspěvekZaslal: 28. únor 2008, 13:54:21    Předmět: Odpovědět s citátem

Very Happy Diky moc Wink Vycerpavajici a kvalitni odpoved Wink Jak budu mit chvilku cas, hned to vyzkousim...

Jeste jednou diky!
_________________
Squadra Moravia
http://www.dvorakmichal.eu - osobní stránky
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
michaldawn



Založen: 26. 02. 2008
Příspěvky: 6
Bydliště: Brno

PříspěvekZaslal: 12. březen 2008, 15:45:04    Předmět: Odpovědět s citátem

Řekněme, že by se pro baterku misto textury použil třeba ten trojúhelník. Jak by se příklad potom změnil?
_________________
Squadra Moravia
http://www.dvorakmichal.eu - osobní stránky
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> .NET Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna