HTML

gondolataim elsősorban játékfejlesztésről

Elsősorban játékfejlesztés magyarul: az enginem fejlesztése során felmerülő problémák, ötletek, tévutak stb dokumentálása, amely számomra és talán mások számára is hasznos lehet később Másodsorban gondolatok szavakban...

Kapcsolat:
aalberik 'at' gmail 'dot' com

Haletető

Galéria

Címkék

Összes

Linkblog

Naptár

december 2024
Hét Ked Sze Csü Pén Szo Vas
<<  < Archív
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

Light space perspective shadow mapping

2009.04.03. 19:00 :: syam

Amióta a 1978-ban Lance Williams bemutatta a shadow mapping technikát számos továbbfejlesztési kezdeményezés látott napvilágot. Ezek közül néhány hatékonynak is bizonyult, míg a legtöbb leginkább csak elméleti jelentőségű.

De miért volt / van szükség ennek az árnyékolási módszernek a folyamatos fejlesztésére? A válasz egyszerű, mindmáig nem létezik tökéletes shadow mapping módszer vagyis olyan, amely minden jelenetben tökéletes renderelési eredményt nyújtana.

A legtöbb probléma abból ered, hogy ez a technika egy renderelés eredményeként kapott képet használ fel textúraként az árnyékok előállítására és ennek a textúrának a mérete / felbontása alapjaiban befolyásolja az ezzel a technikával elérhető minőséget (hasonlóképpen a kép "színmélysége" is befolyásoló tényező a mélységi felbontás tekintetében). Látható, hogy a shadow map főbb problémái abból erednek, hogy a felhasználása egy textúra vetítést (is) igényel! Ezt a problémát hívják perspective aliasingnak vagyis a texturának a közelre vetített része alacsony felbontásu (szögletes) míg távolodva a felbontás valamelyest javul.

Erre a problémára jelenleg két megoldást ismerek.

  • Az egyik a kép felbontásának a növelése, amely azonban egy bizonyos határig lehetséges.
  • A másik megoldás az adott kép optimális felhasználásán / kihasználásán alapul.

Erre a trükkre az alábbi felfedezés tesz képessé minket. A shadow mapet akkor tudjuk igazán optimálisan kihasználni, ha a megjelenített végső jeleneten az árnyékok mérete arányban van a shadow mapben tárolt árnyékok méretével. Vagyis minél távolabb van egy árnyék a kamerától annál kisebbnek látszik majd a jelenetben így elegendő kisebb méretben tárolni a shadow mapben is. Fordítva pedig, minél közelebb van valami a kamerához annál részletesebb árnyékot szeretnénk látni. Bonyolultabban fogalmazva: az a célunk, hogy a renderelt jeleneten N pixelen látszódó árnyék N-nel arányos mennyiségű texelt foglaljon el a shadow mapen ezzel csökkentve a perspective aliasingot.

Ennek a gyakorlati kivitelezése a perspective shadow mapping, a light space perspective shadow mapping, trapezoidal shadow mapping, logarithmic perspective shadow mapping, queried virtual shadow mapping, fitted virtual shadow mapping, parallel-split shadow mapping stb, melyekből (tudomásom szerint) igazán kettő vált széleskörben népszerűvé: a lispsm és a pssm.

Lássuk, hogyan nyújt a lispsm megoldást a perspective aliasingra. Egyszerűen és tömören ugy fogalmazhatnánk meg a megoldást, hogy a shadow mapen a kamerához közel eső árnyékokat "széthúzzuk" ezzel együtt a távoli árnyékokat "zsugorítjuk". Ezt a trükköt plusz egy perspektív vetítéssel éri, amely az egész technika lényegét képezi.

Ahhoz, hogy ezt a vetítést meg tudjuk tenni (elő tudjunk állítani egy vetítési mátrixot), szükségünk van egy teljes jelenet analízisre. Első nekifutásra ez kicsit félelmetesnek tűnhet. Második nekifutásra semmi mást nem jelent, csak elő kell állítanunk azon jelenet elemek listáját

  • amelyek láthatók és árnyékot kapnak
  • amelyek árnyékot vetnek a látható, árnyékot kapó elemekre.

Miután ezzel megvagyunk előállítjuk ezen elemek befoglaló térfogatát pontosabban elég a befoglaló test pontjait meghatározni. Itt célszerű minél nagyobb (lehető legnagyobb) pontosságra törekedni, mert a közeli árnyékok minősége ennél a lépésnél dől el(!) mivel utolsó lépésként egy perspektiv frustummal ezt a ponthalmazt fogjuk befogni. Ehhez átvisszük egy módosított fény térbe ezeket a pontokat és meghatározzuk a fénytől legtávolabbi és legközelebbi pontok távolságát. Ezen távolságok ismeretében ki tudunk számolni egy olyan virtuális poziciót, amelyből a ponthalmaz teljesen látszik.

Végezetül tehát a technika a shadow map működésén semmit nem változtat egyszerűen a vetítést teszi hatékonyabbá (akár felhasználható más textúra vetítést igénylő feladatok esetében is!). Mindössze még plusz egy mátrix transzformációt igényel vagyis gpu oldalon semmilyen változatás nem szükséges, cpu oldalon pedig némi többlet munkát bár ezen munkák egy részét mindenképp elvégezzük. A lispsm párhuzamos fényre és splot lightra is alkalmazható azonban omni fényforrásra nem! Megjegyzendő még, hogy a lispsm igen rossz eredményt produkálhat, ha nem figyelünk arra az esetre, amikor a fény vektora és nézeti vektor közel párhuzamossá válik!

Nem esett most szó sem az ún. projection aliasingról (amikor egy olyan felületre történik a vetítés, amely majdnem párhuzamos a vetítés irányával), amely szintén a textúra vetítés miatt jön létre és amelyre az itt megemlített technikák egyike sem nyújt megoldást, sem a shadow map tulajdonképpeni működéséről (depth texture, depth comparison stb).

 

Szólj hozzá!

Címkék: shadow map lispsm perspective aliasing projection aliasing

A bejegyzés trackback címe:

https://sakura7.blog.hu/api/trackback/id/tr441043639

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása