Manufatti della mappa dell'ombra


16

Voglio provare ad aggiungere ombre a un gioco XNA 3D. Ho creato un ambiente di test con una luce e una videocamera. Tuttavia, sto incontrando artefatti con il mio approccio.

Sto usando il codice shader da http://pastebin.com/zXi0hmsU per rendere il risultato finale e http://pastebin.com/rY4Gcj9N per creare le mappe d'ombra. Il codice è piuttosto semplice e prevede la produzione della mappa di profondità dal punto di vista della luce, quindi la proietta nello spazio della telecamera e verifica la presenza di occlusioni.

Tuttavia, dalla maggior parte delle angolazioni sto ottenendo risultati piuttosto brutticome in questo screenshot

La scena è composta da alcuni cubi semplici (costruiti a mano, rivolti verso l'esterno, la faccia posteriore è abbattuta), una luce (la mappa delle ombre mostrata nell'angolo in alto a sinistra - sembra a posto) e una telecamera.

My RenderTarget per le mappe shadow è inizializzato da

int shadowMapSize = 512;
RenderTarget2D shadowMap = new RenderTarget2D(GraphicsDevice, shadowMapSize,
    shadowMapSize, true, GraphicsDevice.PresentationParameters.BackBufferFormat,
    DepthFormat.Depth24Stencil8);
GraphicsDevice.SetRenderTarget(shadowMap);
GraphicsDevice.Clear(Color.White);
GraphicsDevice.DepthStencilState = DepthStencilState.Default;

Successivamente, CreateShadowMapviene applicato l' effetto, seguito dall'effetto LambertWithShadows. Infine, la mappa ombra viene disegnata usando a SpriteBatch.

Il resto del codice consiste semplicemente nel fornire i valori corretti agli shader. Se necessario, posso fornirlo bene.

Risposte:


19

Questo è un tipico problema chiamato acne della mappa ombra . È causato dal pixel proiettato della mappa ombra (profondità) più grande del pixel sullo schermo (l'eq. Non può rappresentare correttamente la profondità).

inserisci qui la descrizione dell'immagine

Ci sono molte soluzioni a questo. Il primo più facile è il bias (lo vedo nel tuo codice, quindi non è questo il problema). E la seconda soluzione semplice è la mappa delle ombre con una risoluzione maggiore, è davvero più che tipico avere delle mappe d'ombra con una risoluzione di 2048x2048 sull'attuale hw. (EDIT: non è vero, l'ho scritto quando stavo lavorando al rendering del film. Nello sviluppo del gioco, vuoi mantenere la tua mappa ombra il più piccola possibile)

Alcune risorse per studiare tecniche più avanzate.


modificare:


Ho del materiale in più su questo argomento, se sei interessato lo condividerò anch'io.
Notabene,

Il problema principale con grandi risoluzioni è che alla fine del gioco ho circa 3-4 luci che non sono dirette => Dovrò usare mappe d'ombra cubiche lì, che si traduce in 24 mappe d'ombra. Se hai del materiale aggiuntivo, apprezzerei davvero il tuo sforzo di condividerlo con me :-)
Etan

Mi interessa almeno se è importante :)
James

1
@Etan. Sì, le luci omnidirezionali sono un vero dolore se si parla di ombre. (ne so qualcosa :) gamedev.stackexchange.com/questions/6203/… ). Prova a usare due mappe paraboloidi. Oppure, se ti piacciono le cubemap, prova a risparmiare un po 'di spazio con l'abbattimento dell'intersezione frustum-camera_frustum per ogni faccia / rendering. Probabilmente non avrai bisogno di ombra per tutte le direzioni per tutto il tempo (specialmente negli esterni)
Notabene

1
@Etan @James Ho aggiunto altre cose per te. Vale la pena leggere entrambi se sei interessato a questo argomento.
Notabene,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.