Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
pospa
Založen: 22. 05. 2010 Příspěvky: 44
|
Zaslal: 28. květen 2010, 06:57:07 Předmět: |
|
|
Hm... ok. Jenze ja uz je ladim tak dlouho, ze jsem z toho uz dost frustrovanej
Nasel jsem tohle
http://www.dhpoware.com/demos/xnaShadowMapping.html
coz dela presne to, jak popisuje Augi, akorat me stve, ze pri pohybu kamery to flickeruje |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 28. květen 2010, 07:45:39 Předmět: |
|
|
Co přesně myslíš tím flickerováním?
Jinak o shadow mapách jsem napsal diplomku - je tam teorie i praxe, tak třeba by se Ti to mohlo hodit:
https://dip.felk.cvut.cz/browse/details.php?f=F3&d=K13136&y=2008&a=augusm1&t=dipl
Přečti si klidně jen závěr, kde jsou shrnutý výhody a nevýhody různých modifikací stínových map, některý si vyber a koukni na ně podrobněji.
Při implementaci stínových map řešíš dva hlavní problémy:
1) Self-shadow alias - objekt díky různým nepřesnostem zastiňuje sám sebe. Pro začátek bys mohl udělat třeba to, že bys při renderingu stínové mapy obrátil culling tak, že bys vykresloval pouze plochy odvrácené od světla. Tím se "zbavíš" self-shadow aliasu a většinou můžeš díky tomu nastavit ten konstantní posun (bias) na nějakou menší hodnotu. Ale doporučuju tam vždy nějaký minimální mít - de facto totiž tímhle trikem s odvrácenými trojúhelníky jen přesunuješ problém na zastíněné plochy, které jsou většinou tmavší a nebývají tolik na očích. (strana 50)
2) Zubaté kraje stínů. Ty se řeší většinou dvěma přístupy, které lze kombinovat:
a) Filtrace stínové mapy. Zde se většinou používá PCF (percentage-closer filtering, strana 57) - to je použito i v tom posledním odkazovaném příkladu. Ale zajímavou alternativou jsou VSM (Variance Shadow Mapping), za kterým stojí ne úplně jednoduchá teorie, ale implementace je velmi jednoduchá (strana 63).
b) Parametrizace stínové mapy. To většinou znamená to, o čem jsem už psal - snažíme se vytvářet stínovou mapu jen pro tu část scény, kterou zabírá pohledový jehlan (frustum). Zde koukni na kapitolu 8.4.1 na straně 79 - vymyslel jsem úplně jednoduché a přímočaré řešení tohodle problému. Implementace je jednoduchá a výsledky vynikající.
A hlavně zásadní problém, který většina lidí vůbec neřeší a pak mají hnusné stíny - kapitola 5.7 - použij ten vzorec na přepočet hodnoty ukládané do stínové mapy! Hloubka by měla být ve stínové mapě distribuována lineárně... |
|
Návrat nahoru |
|
 |
pospa
Založen: 22. 05. 2010 Příspěvky: 44
|
Zaslal: 28. květen 2010, 08:48:45 Předmět: |
|
|
Flickerovanim myslim blikani stinu - hlavne na okrajich a pak u trochu slozitejsich struktur - napr parapet pod oknem, detailni, ale maly zabradli apod. Omlouvam se za debilni vyraz
Za odkaz na diplomku moc diky! Uz jsem ji stahnul a prectu si ji celou, urcite mi objasni spoustu veci, o kterych nemam ted ani paru.
K bodu 1) - pokud obratim culling, tak vlastne zrusim stiny, ktery by normalne byly videt z predni strany, je to tak?
K bodu 2) - projdu to a vyzkousim
Jeste jednou diky |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 28. květen 2010, 09:45:18 Předmět: |
|
|
pospa napsal: |
Flickerovanim myslim blikani stinu - hlavne na okrajich a pak u trochu slozitejsich struktur - napr parapet pod oknem, detailni, ale maly zabradli apod. Omlouvam se za debilni vyraz  |
To bude imho způsobené buď self-shadow aliasem (tzn. zkusit upravit velikost biasu a hlavně bych zkusil ten front-face culling při vytváření stínové mapy) nebo taky tím nevhodným rozložením hodnot ve stínové mapě (kapitola 5.7).
pospa napsal: |
K bodu 1) - pokud obratim culling, tak vlastne zrusim stiny, ktery by normalne byly videt z predni strany, je to tak? |
Noo, uděláš tím to, že stíny nebudou vrhat trojúhelníky přivrácené ke světlu, ale trojúhelníky odvácené. Principielně je totiž u uzavřených objektů (jiné ale v běžných scénách nebývají) jedno, které trojúhelníky se použijou, protože se kamera nemůže dostat dovnitř tělesa (mezi odvrácený a přivrácený trojúhelník). Pokud by mohla, pak bys musel použít klasický back-face culling (ale to by byla hodně zvláštní scéna imho). |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
|
Návrat nahoru |
|
 |
pospa
Založen: 22. 05. 2010 Příspěvky: 44
|
Zaslal: 31. květen 2010, 13:18:20 Předmět: |
|
|
Jo, diky. Riemeruv tutor je asi dobrej, ale je to spis jen takovej "zacatek" pro shadow mapy, podle toho, co jsem si precet v diplomce i jinde  |
|
Návrat nahoru |
|
 |
pospa
Založen: 22. 05. 2010 Příspěvky: 44
|
Zaslal: 1. červen 2010, 09:01:15 Předmět: |
|
|
Tak si s tim tak nejak hraju a snazim se docilit nejakyho rozumnyho vysledku a nejak se mi nedari Diplomku jsem precet skoro celou, teorie je mi celkem jasna, horsi je uvedeni do praxe. Nevim treba, jak vypocitat optimalni light frustum na zaklade pohledu kamery a plne vyuzit shadow mapu. Chybej mi priklady asi  |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 1. červen 2010, 10:38:01 Předmět: |
|
|
Jak jsem psal, koukni na tu kapitolu 8.4.1 na straně 79 - tam je popsanej úplně jednoduchej způsob, jak vypočítat optimální light frustum.
Nakonec jsem teda pro Tebe vyhrabal ukázkovou aplikaci k tý diplomce, kde je téměř všechno implementováno
http://bordel.augi.cz/diplomka-program.zip
Konkrétně je to tam iplementováno takhle:
kód: |
public static bool CheckWastage(AGE.Frustum frustum, AGE.Matrix shadowMatrix, out AGE.Matrix additionalMatrix)
{
// get frustum points (in world space)
AGE.Vector3[] points = (AGE.Vector3[])frustum.Points.Clone();
// try to find min and max values of frustum corners transformed to shadow map space
float minX = float.MaxValue, maxX = float.MinValue, minY = float.MaxValue, maxY = float.MinValue;
for (int i = 0; i < points.Length; i++)
{
points[i].TransformCoordinate(shadowMatrix);
minX = Math.Min(minX, points[i].X);
maxX = Math.Max(maxX, points[i].X);
minY = Math.Min(minY, points[i].Y);
maxY = Math.Max(maxY, points[i].Y);
}
if (minX > -1 || maxX < 1 || minY > -1 || maxY < 1)
{
minX = Math.Max(-1, minX);
maxX = Math.Min(1, maxX);
minY = Math.Max(-1, minY);
maxY = Math.Min(1, maxY);
additionalMatrix = AGE.Matrix.CreateScaleToRectangle(
new AGE.Vector2(minX, minY), new AGE.Vector2(maxX, maxY),
new AGE.Vector2(-1, -1), new AGE.Vector2(1, 1));
return true;
}
else
{
additionalMatrix = AGE.Matrix.Identity;
return false;
}
} |
|
|
Návrat nahoru |
|
 |
pospa
Založen: 22. 05. 2010 Příspěvky: 44
|
Zaslal: 1. červen 2010, 10:44:08 Předmět: |
|
|
Ty jo.. jsi fakt moc hodnej, diky! Projedu to a snad uz to dam nejak do kupy. |
|
Návrat nahoru |
|
 |
|