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
|
Zaslal: 26. únor 2008, 15:47:39 Předmět: Vrstvy a průhlednost v XNA. |
|
|
Dobrý den. Chtel jsem se zeptat na par informaci ohledne vrstev a pruhlednosti v XNA. Nez bych slozite formuloval otazku, zkusim popsat nazorny priklad
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 |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 26. únor 2008, 16:15:00 Předmět: |
|
|
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 |
|
|
juroo
Založen: 28. 07. 2007 Příspěvky: 28
|
|
Návrat nahoru |
|
|
Mem
Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 26. únor 2008, 20:38:17 Předmět: |
|
|
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 |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 26. únor 2008, 21:27:26 Předmět: |
|
|
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 |
|
|
juroo
Založen: 28. 07. 2007 Příspěvky: 28
|
Zaslal: 26. únor 2008, 21:42:02 Předmět: |
|
|
ahaa, tak uz mi je to jasne. Mem to pekne ozrejmil a Eo dal rovno navod, takze vec je myslim vyriesena |
|
Návrat nahoru |
|
|
Mem
Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 27. únor 2008, 07:50:26 Předmět: |
|
|
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 _________________
|
|
Návrat nahoru |
|
|
michaldawn
Založen: 26. 02. 2008 Příspěvky: 6 Bydliště: Brno
|
Zaslal: 28. únor 2008, 09:13:50 Předmět: |
|
|
Díky kluci, jste blizko 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.. _________________ Squadra Moravia
http://www.dvorakmichal.eu - osobní stránky |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 28. únor 2008, 11:37:17 Předmět: |
|
|
Já věděl, že to nebude tak jednoduchý, jak si myslel Mem 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í
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 Teda snad správně, radši to po mně někdo překontrolujte Jinak v shaderu by to bylo na pár řádek a mnohem efektivnější 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 |
|
|
michaldawn
Založen: 26. 02. 2008 Příspěvky: 6 Bydliště: Brno
|
Zaslal: 28. únor 2008, 13:54:21 Předmět: |
|
|
Diky moc Vycerpavajici a kvalitni odpoved Jak budu mit chvilku cas, hned to vyzkousim...
Jeste jednou diky! _________________ Squadra Moravia
http://www.dvorakmichal.eu - osobní stránky |
|
Návrat nahoru |
|
|
michaldawn
Založen: 26. 02. 2008 Příspěvky: 6 Bydliště: Brno
|
Zaslal: 12. březen 2008, 15:45:04 Předmět: |
|
|
Ř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 |
|
|
|