Manufatti per la mappatura dell'ombra


8

Ho giocato con la mappatura delle ombre in OpenGL usando trame di profondità. La trama di profondità va bene e posso mapparla sulla scena ma ho alcuni strani artefatti sul retro dell'oggetto:

Sfera che getta un'ombra, con artefatti sul retro

La mia domanda è: cosa sta causando questo e come posso risolverlo?

Lo shader di frammenti che sto usando è abbastanza semplice (ho eliminato il colore per semplicità nel caso ti stia chiedendo perché qui non c'è blu):

in vec4 vShadowCoord;

uniform sampler2DShadow shadowMap;

out vec4 fragColor;

void main()
{
    float bias = 0.005;
    float visibility = 1.0;
    if (texture(shadowMap, vec3(vShadowCoord.xy, vShadowCoord.z / vShadowCoord.w)) < (vShadowCoord.z - bias) / vShadowCoord.w)
        visibility = 0.25;

    fragColor = vec4(visibility);
}

Modifica: come richiesto, screenshot minimo di esempio funzionante che utilizza solo il codice sopra (nessun colore).

Stessa sfera, meno colore


1
Puoi confermare se il codice mostrato (con il blu rimosso) causa anche i manufatti? Se hai ristretto il codice, mostrare l'immagine dal codice ristretto ti aiuterà a escludere qualsiasi dettaglio irrilevante e ad evidenziare il problema.
trichoplax,

Sì, ho pensato che avrei preso uno screenshot con il colore lì dentro, altrimenti sembra ancora più brutto :)
Blarglenarf

Posso capirlo, ma dato che è la bruttezza con cui stai chiedendo aiuto, potresti avere maggiori possibilità che qualcuno veda il problema se includi anche lo screenshot che corrisponde al codice.
trichoplax,

1
Giusto. Ho aggiunto uno screenshot extra.
Blarglenarf,

Hai provato a giocare un po 'di più con il pregiudizio?
cifz,

Risposte:


11

Questo problema si presenta come artefatti standard dell'acne sulla mappa delle ombre. Inoltre, l'equazione dell'illuminazione è incompleta o errata. La luce non dovrebbe influenzare i volti con le normali rivolte verso di essa. Ciò significa anche che con un'equazione adeguata il lato "oscuro" della sfera non dovrebbe avere artefatti da acne.

Esistono tre fonti di artefatti da acne:

  • La prima fonte di acne è la precisione della mappa ombra. Assicurati che i piani vicini e lontani di luce che proiettano ombre siano il più stretti possibile. Tutti gli oggetti prima del piano vicino possono essere schiacciati, poiché la loro profondità esatta non è importante.
  • La seconda fonte di acne è la risoluzione della mappa ombra. Per una luce direzionale dovresti fare mappe d'ombra in cascata con almeno 3 cascate 1024x1012 per ~ 100-200m di distanza d'ombra. È difficile coprire una simile distanza d'ombra con una mappa d'ombra con una proiezione uniforme.
  • La terza fonte di acne è il filtro per mappe d'ombra larghe come il PCF, poiché l'uso di un singolo valore di confronto della profondità in un kernel largo è insufficiente. Esistono molti metodi per risolverlo, ma nessuno di questi è robusto.

Per riassumere, è sufficiente un frustum stretto con alcune cascate e alcune modifiche di polarizzazione per far funzionare il caso generale (luce direzionale). Inizia a modificare disabilitando il filtro ombra e ottimizza il filtro solo quando le mappe ombra di base sono abbastanza robuste.

Inoltre, oltre alla distorsione di profondità costante (attualmente in uso), è necessario aggiungere una distorsione di profondità di pendenza e una distorsione di profondità di pendenza massima. Entrambi possono essere implementati come stato di rendering o come codice shader durante il rendering di shadowmap. Il bias di profondità del pendio è semplicemente un valore di bias magico ridimensionato dal punto (normal, lightDir).

Ci sono altri metodi interessanti e molti di questi sono implementati nell'eccellente demo: Matt Pettineo - "Un campionamento di tecniche d'ombra" .

  • Capovolgi l'abbattimento durante il rendering della mappa delle ombre (scambia l'acne per il panning di Peter).
  • La normale mappatura dell'ombra di offset fa miracoli per i problemi di polarizzazione, ma richiede di avere normali vertici durante l'ombreggiatura.
  • I metodi basati sulla varianza (ESM, VSM, EVSM) rimuovono completamente i problemi di polarizzazione, ma presentano altri inconvenienti (perdite di luce e / o problemi di prestazioni).
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.