Daniele Banovaz 30 maggio 2006 Elementi di Grafica Digitale, A.A. 2005-2006 Stencil Shadows L’importanza delle ombre • La resa efficace delle ombre è un elemento importante per agevolare la percezione della profondità all’interno di scene 3D, e, in certi casi, essa rappresenta l’unico riferimento per comprendere a colpo d’occhio il posizionamento relativo di oggetti disgiunti. • La volontà di aumentare il fotorealismo in videogames, ambienti virtuali ed altre applicazioni grafiche interattive ha dato vita a numerosi algoritmi per la resa ed il perfezionamento di ombre realistiche; le due tecniche maggiormente utilizzate sono Shadow Maps e Stencil Shadows Volumes. Shadow Maps (Lance Williams, 1978) • Tecnica pensata per essere semplice, generale ed efficiente, nelle applicazioni in tempo reale è pienamente supportata in HW e risulta computazionalmente molto veloce; tuttavia la quantità di memoria presente sulle schede video risulta ancora troppo bassa per una resa “pulita” e senza artefatti. • In particolare, per la dipendenza stretta del metodo da rasterizzazione e proiezione prospettica della mappa d’ombra, sono inevitabili nelle applicazioni odierne dei forti fenomeni di aliasing delle silhouettes; tuttavia vi sono in corso numerosi studi per l’eliminazione del fenomeno sui piani d’interesse (in particolare Chong and Gortler, 2004). Shadow Maps passo passo Un caso d’uso attuale: CoD2 Volume Shadows (Frank Crow, 1977) • Questa tecnica e le sue derivate si basano sulla ricostruzione dei volumi d’ombra che si stagliano dagli oggetti illuminati (“shadow casters”) • Vi sono differenti metodologie che differiscono in accuratezza e velocità di calcolo, che tuttavia partono da una base comune: la generazione dei volumi. Generazione dei volumi • Tale procedimento si compone dei seguenti passi: - Individuazione dei silhouette edges, cioè gli spigoli di separazione tra facce illuminate (front-facing faces) e facce in ombra (back-facing faces); tale procedimento, che per modelli complessi risulta computazionalmente dispendioso, nelle applicazioni real time viene approssimato, sia per esigenze di velocità, sia per la frequente mancanza di spigoli separatori ideali in modelli “low-poly count”. - Definizione dei volumi: gli spigoli individuati vengono estesi in direzione opposta alla luce a formare dei quadrilateri. - Eventuale chiusura dei volumi, utilizzata in tecniche avanzate come lo Zfail o in qualche correzione dello Zpass. Le prime implementazioni • La prima tecnica per la resa delle ombre attraverso gli Shadow Volumes è la ExclusiveOR: lo stencil buffer viene riempito pixel per pixel invertendo il valore per ogni volume che passa lo Z-test. • Questa implementazione, che richiede un solo passo addizionale, è molto veloce ma presenta moltissime imperfezioni, tra cui l’annullamento dell’ombra nelle intersezioni tra i volumi ed il problema, comune allo Zpass, del near clipping plane. Zpass • La tecnica più diffusa negli anni precedenti è rappresentata dallo Zpass: un algoritmo relativamente semplice e non esente da difetti. • A differenza dell’ExclusiveOR, lo Zpass utilizza uno stencil buffer con più bit per pixel, nei quali conteggia gli attraversamenti di volumi; i passi assomigliano a quelli che compongono il metodo precedente, cambia ciò che viene salvato sullo stencil buffer: le facce front-facing incrementano il valore, mentre le back-facing lo decrementano. Valori finali diversi da zero indicano che la zona è in ombra. Zpass 1. 2. 3. 4. • Rendering della scena utilizzando solo luci ambientali Rendering delle facce front-facing sullo stencil buffer: se passano il depth test i pixel corrispondenti vengono incrementati. Rendering delle facce back-facing sullo stencil buffer: se passano il depth test i pixel corrispondenti vengono decrementati. Viene eseguito il rendering della scena complessiva con diffuse e specular lightening solo nelle aree in cui lo stencil buffer vale zero. Nella figura risulta evidente il problema più grosso di questo approccio: il near clipping plane. Tale piano infatti, tronca i volumi d’ombra vicini all’osservatore, escludendoli dal conteggio nello stencil buffer. Ne risultano zone erroneamente in ombra o illuminate qualora lo shadow volume si trovi ad attraversare questo piano. Zfail • Nel tentativo di porre rimedio agli artefatti causati dal near plane, svariati studi giungono a definire un approccio inverso, che considera i volumi che falliscono il depth-test. L’implementazione più consistente di questo robusto metodo nasce con l’engine di Doom III, ad opera di John Carmack (da cui l’altro nome con cui è noto lo Zfail: “Carmack’s Reverse”). • Tale metodo sposta il problema dal near al far plane, dove può essere aggirato estendendo il piano e la proiezione del “dark cap” lungo il volume d’ombra a un “homogeneus infinity” (Everitt and Kilgard, 2002). Zfail 0. • • • • • Chiusura dei volumi d’ombra alle estremità. Rendering della scena utilizzando solo luci ambientali Rendering delle facce front-facing sullo stencil buffer: se falliscono il depth test i pixel corrispondenti vengono decrementati. Rendering delle facce back-facing sullo stencil buffer: se falliscono il depth test i pixel corrispondenti vengono incrementati. Viene eseguito il rendering della scena complessiva con diffuse e specular lightening solo nelle aree in cui lo stencil buffer vale zero. Questo metodo, più robusto del precedente, risulta anche più lento, in quanto è necessario calcolare la geometria per “chiudere” i volumi e, inoltre, viene escluso da alcune ottimizzazioni che per loro natura escluderebbero immediatamente le geometrie che falliscono il depth test. Zfail: Doom III Il futuro dello Zpass: ZP+ • Come specificato in precedenza, lo Zpass processa gli shadow volumes in maniera efficiente ma scorretta nel caso di intersezione con il near clipping plane: vi sono molti metodi per “tappare” i volumi troncati, ma tutti molto poco efficienti e soggetti ad altri artefatti dovuti soprattutto ad imprecisione aritmetica. L’unica alternativa robusta è data dallo Zfail, ma a costo di una maggior complessità elaborativa e del sacrificio dell’accelerazione data dall’early depth culling dei volumi d’ombra coperti al punto di vista. • Una soluzione a questo problema è la promettente tecnica del Correct Zpass, altrimenti detto ZP+. Questo metodo, proposto nel 2004 da Samuel Hornus, Jared Hoberock, Sylvain Lefebvre e John Hart, riprende l’approccio seguito dallo Zpass, utilizzando un procedimento analogo alle shadow maps per inizializzare lo stencil buffer definendo al contempo delle chiusure perfette per i volumi troncati. L’innovazione del ZP+ • • • Al posto di calcolare complesse geometrie di chiusura, spesso disallineate e responsabili di “crepe” nelle ombre, questo sistema prevede una fase di inizializzazione dello stencil buffer, in cui il punto di vista viene spostato sulla luce ed il far clipping plane viene fatto coincidere con il near del punto di vista dell’osservatore. La rasterizzazione attribuisce alle facce frontali un incremento dello stencil buffer ed alle altre un decremento. Alla fine di questa fase di inizializzazione, il punto di vista ritorna quello dell’osservatore, e viene eseguito un normale Zpass: dal momento che il buffer è già inizializzato con i valori dei volumi tra osservatore e near clipping plane, si evitano i problemi dei volumi tronchi. Performances • Lo Zpass semplice rimane il metodo più performante, ma presenta errori inammissibili; il confronto viene invece eseguito tra i ben più robusti Zfail e ZP+. • I risultati, su HW di 2 anni fa, mettono in evidenza come lo Zfail sia estremamente compromesso dall’aumentare della complessità dei modelli, e possa risultare più lento anche dell’80% rispetto allo Zpass. • Lo ZP+ invece, si attesta ad ottimi valori, che ricalcano gli andamenti dello Zpass pur rimanendo più lento di circa il 10%. Decremento di prestazioni (%) rispetto allo Zpass twisted torus (12.000 tr) head (20.222 tr) pregnant woman (83.666 tr) --- : Zfail --- : ZP+ Perché ZP+ è più veloce 1. ZP+ non ha bisogno del “dark cap” all’infinito, mentre lo Zfail deve fare il rendering degli “occluders” due volte. 2. Zfail non può trarre beneficio dalle “batched geometry” (per es. triangle strips), perché non supportano la classificazione dei vertici come appartenenti a dark o light cap. 3. Dal momento che la dimensione del light frustum è molto inferiore a quella del camera frustum, la percentuale di geometria scartata con il culling nello Zpass è molto più alta rispetto allo Zfail: anche le “chiusure” delle geometrie non troncate dal near plane devono essere calcolate manualmente nello Zfail, mentre lo ZP+, eseguendo il rendering nel light frame, può avvalersi del culling HW. 4. Infine, lo Zfail non può godere dei benefici apportati dall’early depth culling, che nell’intento di ridurre il prima possibile la complessità geometrica escluderebbe poligoni rilevanti per il calcolo delle ombre. Bibliografia • ZP+: Correct Z-pass Stencil Shadows, (Samuel Hornus, Jared Hoberock, Sylvain Lefebvre, John Hart) (http://artis.imag.fr/Publications/2005/HHLH05/hhlh-zp-plus.pdf) • Stencil Shadow Volumes, (oZone3D Tutorials, http://www.ozone3d.net/tutorials/stencil_shadow_volumes.php) • John Carmack - E-mail to private list (2000). Published on the NVIDIA website. • Specifiche nVidia UltraShadow (fonte: nVidia) (http://www.nvidia.com/attach/63050?type=support&primitive=0) • Specifiche nVidia UltraShadow II (Tom’s Hardware Italia) (http://www.tomshw.it/graphic.php?guide=20040414&page=feforce_6800-13#ultra_shadow_ii) • Wikipedia: – – – – • Shadow mapping (http://en.wikipedia.org/wiki/Shadow_mapping) Shadow volume (http://en.wikipedia.org/wiki/Shadow_volume) Stencil shadow volume (http://en.wikipedia.org/wiki/Stencil_shadow_volume) Silhouette edge (http://en.wikipedia.org/wiki/Silhouette_edge) …altri siti di cui ho perso i riferimenti…