Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
franz
Založen: 30. 07. 2007 Příspěvky: 1325
|
Zaslal: 23. listopad 2010, 22:17:29 Předmět: glsl self-shadows |
|
|
Hello, chtěl bych udělat pěkné a rychlé vzájemné vrhání stínů na objekty. V podstatě nic nového.
Zatím mám jednoduchý základ - vyrenderuji pomocí FBO Depth-Buffer, který v shaderu namapuji s původní texturou:
kód: |
uniform sampler2D TextureMap;
uniform sampler2DShadow ShadowMap;
void main()
{
float shadow = shadow2DProj(ShadowMap, gl_TexCoord[1]).r;
vec4 color = texture2D(TextureMap, gl_TexCoord[0].st);
gl_FragColor = color * shadow;
}
|
Výsledek:
Jak se nyní zbavit toho ditheringu, který vzniká na objektu v místech, kde by měl stín spíše mizet do ztracena? Patrně nějak rozmazat... ale jak? Samotné posunutí koordinátů stínu do všech směrů a zprůhlednění sice vypadá lépe, ale není to pořád ono.. jak to dělají ostatní? |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 23. listopad 2010, 22:40:17 Předmět: |
|
|
Hi,
existuje hafo optimalizací stínových map - napsal jsem o tom diplomku (je tam PDF ke stažení).
Dvě úplně nejzákladnější optimalizace najdeš třeba tady:
1) Rozmazat shadow mapu (to můžeš zkusit, ale spíš to nedoporučuju).
2) Percentage Closer Filtering - když čteš vzdálenost se stínové mapy, tak přečteš 4 texely, provedeš pro ně samostatné vyhodnocení viditelnosti (tj. dostaneš čtyři výsledky, tj. čtyři hodnoty 0 nebo 1) a tyhle 4 výsledky zprůměruješ. |
|
Návrat nahoru |
|
|
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 25. listopad 2010, 11:26:22 Předmět: |
|
|
Ale zase je to docela žrout výkonu to PCF, na větší shadowmapy se to moc nehodí. Ještě jsou Variance Shadow mapy, to taky není špatný, jenom potřebuješ ještě jednu shadowmapu mám dojem. |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 25. listopad 2010, 12:15:15 Předmět: |
|
|
Nadhodil jsem mu dvě implementačně jednoduchý optimalizace, který může mít hotový během pár minut.
Další metody optimalizace jsou uvedeny v té odkazované diplomce... |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 25. listopad 2010, 13:49:44 Předmět: |
|
|
PCF je v pohode a na zaciatok to urcite odporucam. Z dalsich jednoduchych optimalizacii, ktore sa ale nejavia uplne trivialne odporucam vypocet near a far planes pre generovanie shadowmapy za pomoci informacii o obalkach objektov v scene. Dostanes tak mensi rozsah Z, tj vyssiu presnost a menej artefaktov. Dost casto nie je nijaka geometria vo vzdialenosti "0.001" od svetla, je teda nezmysel to pokryvat. Zvysenie rozlisenia v XY zase dosiahnes podobnym sposobom tak, ze zmenis "focus" svetla pri generovani shadowmapy len na shadowcastery. Toto ti ale casto nijako nepomoze, napriklad ked tam ams jeden velky shadowcaster, ktory zakryva cely pohlad svetla (napriklad placku na zemi - tu ale bacha, ona by nemusela byt nutne shadowcaster, ked aj tak nikdy neuvidis veci pod nou )
Aby som to zostrucnil: Do shadowmapy kresli len tie objekty, ktore fakt vrhaju tien a to tak, aby zaplnili co najviac texelov (tj nebolo tam prazdne miesto). Objektom pridaj vlastnost "Receive shadow" a "Cast shadow" (a to aj v pripade, ze budu v 98% oboje). _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
franz
Založen: 30. 07. 2007 Příspěvky: 1325
|
Zaslal: 25. listopad 2010, 13:54:10 Předmět: |
|
|
jj, díky, augi, PCF jsem zkusil, vypadá dobře hlavně na té podlaze, ale na objektu to stále není ono (hlavně při pohybu).
Teď mam takovou divokou verzi s rozmazáním.. no idTech to zrovna není, ale stále zkouším
|
|
Návrat nahoru |
|
|
franz
Založen: 30. 07. 2007 Příspěvky: 1325
|
Zaslal: 25. listopad 2010, 14:01:53 Předmět: |
|
|
pcmaster> toho jsem si také ve hrách všiml, nad tím rozhodně popřemýšlím |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 25. listopad 2010, 14:26:47 Předmět: |
|
|
pcmaster napsal: |
Objektom pridaj vlastnost "Receive shadow" a "Cast shadow" (a to aj v pripade, ze budu v 98% oboje). |
To je dobrý nápad, akorát až pak bude implementovat Variance Shadow Maps, tak ty vyžadují, aby Shadow casters i Shadow receivers byly v shadow mapě, jinak to nebude fungovat.
franz> Zapomeň, že jedním algoritmem na shadow mapy vyřešíš všechny problémy. Shadow mapy jsou dnes dost nevyřešenej problém a žádná technika není perfektvní. Každá řeší jen některé problémy, jenomže shadow mapy těch problémů mají aspoň 10 (ok možná přeháním) a každá technika navíc přidává svoje vlastní problémy (u Variance Shadow Maps jsou to minimálně light bleeding, vyšší nároky na přesnost). Ve výsledku budeš potřebovat minimálně 2 algoritmy, jeden na outdoor a jeden na indoor a oba budou dost odlišné. Dále můžeš mít algoritmy specializované na konkrétní situace. Tady tímto tématem se dá zabít i několik let času. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 25. listopad 2010, 15:41:44 Předmět: |
|
|
Eosie napsal: |
Tady tímto tématem se dá zabít i několik let času. |
jo. a na kazdem siggraph-u je prezentovano 5 novych (dalsich) shadow-mapping algoritmu. who cares |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 25. listopad 2010, 15:49:09 Předmět: |
|
|
Nestraste ho, kua Staci PCF + "geometricke" optimalizacie ake som navrhol a potom sa uvidi, ci mu to bude stacit.
Btw, ked sme pri tom: Kto z vas uz implementoval shadowmapy z vsesmerovych bodovych svetiel? Pochvalte sa. _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
franz
Založen: 30. 07. 2007 Příspěvky: 1325
|
Zaslal: 25. listopad 2010, 16:23:22 Předmět: |
|
|
Spíš jsem doufal, že to nezabere tolik dní pokusomylů, jde-li o provařenou techniku už řadu let používanou snad v každé hře, nemůže to být nic složitého |
|
Návrat nahoru |
|
|
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 25. listopad 2010, 17:22:41 Předmět: |
|
|
pcmaster napsal: |
Btw, ked sme pri tom: Kto z vas uz implementoval shadowmapy z vsesmerovych bodovych svetiel? Pochvalte sa. |
Mam naimplementovane jen planar shadows, pocita se to? |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 25. listopad 2010, 18:35:23 Předmět: |
|
|
Jak píše pcmaster, přistup k tomu pragmaticky
Použil bych následující techniky:
1) Do shadow mapy renderovat jen odvrácené plochy (tj. obrátit culling). Je to jeden příkaz a může ti zvýšit fillrate a zároveň se zbavíš některých artefaktů (resp. je přesuneš někam, kde nejsou tolik na očích).
2) Konstantní posun. Když ukládáš hloubku do stínové mapy, tak k tomu přičíst prťavou konstantu.
3) Když jsme už u toho ukládání, by default se hloubka ukládá nelineárně. Bývá ale lepší mít lineární distribuci, takže je lepší přepočíst z podle vzorce nove_z = w * (z + near) / (far - near).
4) Nějaké filtrování. Pro začátek PCF, později můžeš zkusit třeba Variance Shadow Mapping.
5) Jak psal pcmaster, chce to plochu stínové mapy využít efektivně. Tj. vzít si obálky objektů vykreslovaných do stínové mapy, zjistit maximální a minimální vzdálenost a podle toho nastavit far a near kamery při renderování do stínové mapy. Tím si ošéfuješ rozumně rozsah ukládaných hodnot.
Pak je ještě dobré udělat tohl i pro X a Y.
Tzn. celý tento bod uděláš tak, že si ztransformuješ bounding boxy objektů vrhajících stín do prostoru stínové mapy a zjistší maxima a minima ve všech rozměrech (X, Y, Z). Podle z_min a z_max uděláš near a far, podle ostatních hodnot upravíš viewport (třeba jako další matice za projekční).
Pokud se ti zdá tohle složitý, vyprdni se na bounding boxy všech těles a místo toho použij těleso jedno - frustum kamery. Tj. stačí ztransformovat frustum kamery (použité pro finální rendering) do prostoru stínové mapy a tam si zjistit minima a maxima.
Ale jak psal Eosie, pro každý typ scény může být vhodné něco jiného... |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 25. listopad 2010, 18:44:51 Předmět: |
|
|
pcmaster napsal: |
Btw, ked sme pri tom: Kto z vas uz implementoval shadowmapy z vsesmerovych bodovych svetiel? Pochvalte sa. |
IMHO Manox. |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 25. listopad 2010, 20:22:57 Předmět: |
|
|
Augi napsal: |
pcmaster napsal: |
Btw, ked sme pri tom: Kto z vas uz implementoval shadowmapy z vsesmerovych bodovych svetiel? Pochvalte sa. |
IMHO Manox. |
Uz som sa tu na to imho pytal, ale nikto neriesil PCF ani nijake ine softshadowlike veci na omnilajtoch _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
|