Gestione dell'alias proiettivo nella mappatura delle ombre


15

Sto armeggiando con la semplice modellazione procedurale 3D per realizzare edifici per adolescenti per la stampa 3D. Un esempio:

L'edificio


Per rendere i modelli più leggibili sullo schermo, ho implementato la mappatura delle ombre di base per una singola luce direzionale. Dato che la mia scena non sta cambiando, eseguo il rendering della mappa d'ombra solo una volta usando un riquadro allineato ad asse della scena per capire quali dovrebbero essere i limiti della mappa d'ombra. Le ombre e i limiti sembrano avere tutte le matrici giuste, ma avvicinarsi un po 'sembra terribile:

Primo piano della torre

Dalla lettura che ho fatto, capisco il panning di Peter e cosa potrei fare al riguardo, ma i bordi frastagliati, che credo siano una forma di alias proiettivo, sembrano così cattivi che penso che qualcosa non vada nella mia implementazione di base.

Ho hackerato il pixel shader per mostrare i confini dell'ombra texel:

Mostra i confini di Texel

Ho un filtro bilineare nella trama (senza di essa, ho un'acne grave all'ombra). Purtroppo, anche il mio tentativo di PCF è fallito - sembra altrettanto sfilacciato:

inserisci qui la descrizione dell'immagine

Ecco il singolo caso di esempio con filtro bilineare disabilitato:

inserisci qui la descrizione dell'immagine

Sembra un alias proiettivo "tipico"? Il rendering dinamico della mappa ombra, usando il frustum della vista ritagliato sulla scena, possibilmente con cascata, potrebbe risolvere il problema?

Modifica: aggiunta di un primo piano di filtro bilineare, confronto post ombra, solo per mostrare ciò che ottengo. L'acne brutta ombra si presenta a causa dei bordi interni; Sto modellando con blocchi virtuali sovrapposti e non sto eseguendo una corretta operazione di unione. Dalla mia lettura, l'implementazione di operazioni booleane sui poliedri non è banale, ma mi permetterà anche di implementare volumi di ombre statiche e di ripulire alcuni software di stampa 3D.

Filtro bilineare

Risposte:


10

La mappatura dell'ombra con una qualità accettabile è piuttosto un viaggio. Quindi hai implementato il primo passo: una mappa ombra di base che racchiude staticamente l'intera scena. Ciò significa che la dimensione del tex della mappa ombra nello spazio di visualizzazione della luce rispetto alla dimensione del texel della scena renderizzata nel rapporto dello spazio di visualizzazione della telecamera è piuttosto grande, con conseguente aliasing. Per ridurre questo rapporto più vicino a 1: 1 ci sono tecniche che hai citato come:

  • il modo più semplice è aumentare le dimensioni della tua mappa ombra, per trovare il valore con prestazioni ancora ottimali,
  • allinea la mappa delle ombre con il frustum della telecamera. Quindi la mappa delle ombre comprende una parte più piccola della scena, quindi riduce l'aliasing,
  • questo può essere migliorato in CSM, che fa lo stesso ma è necessario renderizzare la scena per ciascuna delle cascate con diversa posizione centrale della matrice di visualizzazione della luce in base al punto centrale di ogni fetta di frustum.

Alcune delle tecniche di base per levigare il bordo dell'ombra:

  • ovviamente PCF, ma si consiglia di combinare l'implementazione del PCF con l'hardware PCF integrato (in Opengl - utilizzo sampler2DShadow). Ciò comporterebbe meno iterazioni in loop dal tuo lato e PCF più economici,
  • il blocco dei bordi può essere scambiato con rumore usando il disco di Poisson ruotato. I campioni utilizzati per campionare dalla mappa ombra vengono ruotati casualmente ad ogni iterazione del loop PCF.

Puoi anche ricercare le tecniche di smussatura dei bordi come:

  • rendering della mappa d'ombra su framebuffer applicato MSAA,
  • migliorare ulteriormente la PCF mediante l' interpolazione ,
  • numero crescente di campioni con miscela temporale .

La tecnica di base del PCF soffre di acne nell'ombra che può essere risolta applicando un certo offset nel test dell'ombra. Anche il calcolo delle dimensioni di questo offset è un'area di ricerca .

Altri metodi di mappa ombra più avanzati includono:

  • Mappe d'ombra esponenziali e mappe d'ombra della varianza : nella maggior parte dei casi non soffrono di acne nell'ombra e offrono bordi lisci senza blocco, ma a costo di alcune situazioni che perdono luce,
  • Mappe d'ombra a varianza esponenziale - probabilmente la tecnica più avanzata di mappatura dell'ombra della mappa di profondità 2D, combina una grande scorrevolezza del VSM e risolve perdite di luce, con un costo di raddoppio dell'utilizzo della memoria,
  • Ombre morbide più vicine a percentuale - tecnica di base per migliorare le tradizionali mappe d'ombra con penombra variabile,
  • Mappe d'ombra multivista : più mappe d'ombra di una certa tecnica, disposte su area luce, per calcolare ombre morbide realistiche con penombra variabile,
  • Deep Shadow Maps - per migliorare lo scattering volumetrico con le ombre,
  • Raggio di ombre in tempo reale tracciato - probabilmente il futuro.

Non hai fallito con PCF, sembra così :)

Vorrei che ci fosse un modo per applicare la sfocatura gaussiana sulla mappa delle ombre nello spazio di visualizzazione della telecamera, ma non funziona come previsto.


Parte di questo commento ti sta ringraziando per la risposta, quindi ho pensato di farti sapere poiché non riceverai una notifica da lì.
trichoplax,

Sì, l'ho visto ma grazie.
nartece

1

Hai detto che "... filtraggio bilineare nella trama ...". Sembra che tu stia interpolando i valori di profondità della mappa ombra. Il modo corretto di usare l'interpolazione con la mappa ombra è applicarlo sui risultati dei test ombra (per quanto ricordo, OpenGL lo supporta). Potresti anche combinare l'interpolazione dei risultati dei test ombra con PCF, che fornirà risultati molto migliori. Tuttavia, come avrai notato, l'aliasing è una piaga che persegue sempre la mappatura dell'ombra :)

Anche se capisco che stai cercando soluzioni per la mappatura delle ombre (anche perché è abbastanza semplice da implementare), hai mai considerato l'uso dei volumi delle ombre? È molto più complicato da implementare, ma non soffre affatto di aliasing e penso che si adatterebbe perfettamente ai tuoi scopi.


Grazie mille per le risposte! Per ottenere i risultati che sto cercando, potrebbe essere opportuno passare ai volumi shadow. Il link codeflow fornito in "interpolazione" è molto utile - grazie!
Daniel M Gessel,
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.