ombreggiatura basata fisicamente, come combinare parti speculari e diffuse?


8

Dopo aver scritto shader phong e blinn "standard" per un po ', di recente ho iniziato a dilettarmi con l'ombreggiatura basata fisicamente. Una risorsa che mi ha aiutato molto sono queste note del corso , in particolare questo documento - spiega come rendere fisicamente plausibili i blinn.

Ho implementato il modello Blinn proposto nel documento e mi piace molto come appare. Il cambiamento più significativo proposto (imo) è l'inclusione della riflessione di Fresnel, e questa è anche la parte che mi dà problemi. Sfortunatamente, l'autore ha scelto di concentrarsi solo sulla parte speculare, omettendo la riflessione diffusa. Dato ad esempio un riflesso diffuso lambertiano, non so proprio come combinarlo con il blinn "migliorato", perché l'aggiunta di parti diffuse e speculari non sembra più essere corretta.

In alcuni shader ho visto un 'termine di fresnel' in virgola mobile nell'intervallo 0 - 1, basato sugli indici di rifrazione dei media partecipanti. L'approssimazione di Schlick viene utilizzata ogni volta:

float schlick( in vec3 v0, in vec3 v1, in float n1, in float n2 )
{
    float f0 = ( n1 - n2 ) / ( n1 + n2 );
    f0 *= f0;   
    return f0 + ( 1 - f0 ) * pow( dot( v0, v1 ), 5 );
} 

In questo modo, si può quindi interpolare linearmente tra contributo diffuso e speculare in base al termine di Fresnel, ad es.

float fresnel = schlick( L, H, 1.0002926 /*air*/, 1.5191 /*other material*/ );
vec3 color = mix( diffuseContrib, specularContrib, fresnel );

Nel documento, l'autore afferma che questo approccio non è corretto - perché fondamentalmente scurisce il colore speculare ogni volta che L è parallelo o quasi parallelo a H - e che invece di calcolare un f0 basato sugli indici di rifrazione, dovresti trattare il speculare colora se stesso come f0 e fai calcolare la tua approssimazione schlick a vec3, in questo modo:

vec3 schlick( in vec3 v0, in vec3 v1, in vec3 spec )
{
    return spec + ( vec3( 1.0 ) - spec ) * pow( dot( v0, v1 ), 5 );
}

Ciò si traduce nel colore speculare che va verso il bianco ad angoli di occhiata.

Ora la mia domanda è: come potrei introdurre un componente diffuso in questo? A 90 ° il contributo speculare è completamente bianco, questo significa che tutta la luce in entrata viene riflessa, quindi non può esserci un contributo diffuso. Per angoli di incidenza <90 °, posso semplicemente moltiplicare l'intera parte diffusa con (vec3 (1) - schlick), ovvero la proporzione di luce che non viene riflessa?

vec3 diffuseContrib = max( dot( N, L ), 0.0 ) * kDiffuse * ( vec3( 1.0 ) - schlick( L, H, kSpec ) );

O ho bisogno di un approccio completamente diverso?


2
L'hai mai risolto? Sto riscontrando questo esatto problema in questo momento.

1
Vorrei una risposta anche a quello. Lagarde ha anche suggerito un'analoga subrazione di colore speculare (che alla fine "non ha usato"), ma tutto ciò sembra molto arbitrario.
v

Risposte:


1

La breve risposta:

Sembra abbastanza buono?

  • Sì, tienilo.

  • No, giochiamo ancora un po '.

Risposta lunga:

Ottenere un'accurata ombreggiatura fisica realistica richiede più potenza della GPU di quanto sia possibile, dovrai sempre ricorrere a falsi elementi per il semplice motivo che un computer non può simulare l'intero universo, nemmeno l'intero spettro di luce visibile.

È la "valle misteriosa" dell'ombreggiatura.

Non solo a causa dell'illuminazione ambientale e dell'occlusione, ma ad esempio gli ambienti esterni sia diurni che lunari hanno un'enorme quantità di luce dello spettro UV, una piccola parte della quale viene spostata indietro nello spettro visibile da vari materiali, principalmente organici. Diversi tipi di illuminazione a tubo fluorescente e HID emettono anche una buona quantità di luce UV.

L'effetto è sottile ma grazie agli anni di evoluzione il cervello lo elabora istintivamente poiché ciò significava la differenza tra un buon pasto e forse una lunga morte lancinante, quindi se qualcosa è sempre così leggermente fuori dal nostro cervello suona l'allarme "qualcosa è sbagliato" .

Gli stili artistici cartoony, irrealistici e quasi realistici ma intenzionalmente fuori margine (es: Halo) evitano questo problema.

Un altro problema è che due umani non hanno la stessa presenza di recettori RYGBL né la curva di risposta mentre i monitor sono rigorosamente RGB e quindi non possono riprodurre perfettamente le immagini per tutti gli umani. (Rosso, giallo, verde, blu e Luma, vedi Tetrachromacy - http://it.wikipedia.org/wiki/Tetrachromacy )

Non importa quanto duramente lavori, ci sarà "qualcosa di sbagliato" in esso e margini di miglioramento, almeno per qualcuno da qualche parte.

E questo è uno dei motivi per cui ci sono così tanti modelli di ombreggiatura.

Per questo motivo un bravo artista finisce sempre per imbrogliare i livelli di luce e la risposta della luce sugli ambienti in una certa misura per ottenere un risultato "abbastanza buono" (non è mai perfetto), basta dare loro l'accesso al violino con le impostazioni e imbrogliare la loro strada a risultati soddisfacenti.


C'è troppa ricerca in questo settore per dare una tale non risposta.
Tara,

@Tara, benvenuto in Stack Exchange. Sono sicuro che con tutta quella "troppa ricerca in questo settore" ti prenderai il tempo di scrivere una vera e propria "non risposta" e contribuire alla comunità piuttosto che solo un commento di una riga. C'è un piccolo pulsante in questa pagina che dice "Aggiungi un'altra risposta" se riesci a trovarlo. Potrebbe aver bisogno di un po 'di ricerca per trovarlo, ma è lì.
Stephane Hockenhull,

Caspita, quanto passivo-aggressivo. Non ho detto di conoscerlo meglio. Ho detto che so che ci sono un sacco di ricerche là fuori che stanno cercando di affrontare questo problema non solo andando "solo a fare qualsiasi cosa" e andando avanti tangenti sul cervello umano e la morte.
Tara,

Non vedo ancora una nuova risposta diversa da quella "non-risposta" del 2014 e il commento di una riga, non costruttivo, attivo-aggressivo pubblicato 5 anni dopo. Sei benvenuto al 100% a prendere tutte quelle ricerche (di cui finora hai fornito zero link, solo il commento di una riga) che sono perfettamente applicabili ai motori di gioco in tempo reale e prenditi il ​​tempo per riassumere in una risposta adeguata.
Stephane Hockenhull,

Sto bene, grazie. Ho già annullato la votazione della domanda e ho aggiunto il mio commento iniziale per spiegare perché l'ho fatto, perché alla gente non piacciono i voti negativi inspiegabili.
Tara,
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.