È questo il modo corretto di attuare la legge di Beer?


11

Quando implemento la legge di Beer (assorbimento del colore a distanza attraverso un oggetto), per qualche motivo non sembra mai molto bello.

Quando ho il colore dietro l'oggetto, calcolo il colore modificato in questo modo:

const vec3 c_absorb = vec3(0.2,1.8,1.8);
vec3 absorb = exp(-c_absorb * (distanceInObject));
behindColor *= absorb;

Questo mi darà qualcosa che assomiglia a questo (nota un po 'di rifrazione applicata): inserisci qui la descrizione dell'immagine

Ed eccolo senza rifrazione: inserisci qui la descrizione dell'immagine

Si noti che questo è implementato come un giocattolo shader qui .

Ciò soddisfa la descrizione di ciò che fa la legge di Beer, ma non sembra molto buono, non rispetto a scatti come questo: inserisci qui la descrizione dell'immagine

Punti salienti speculari a parte, sto cercando di capire la differenza. Potrebbe essere che la mia geometria sia troppo semplice per mostrarla davvero molto bene? O lo sto implementando in modo errato?


2
Tuttavia, stai confrontando un cubo con una mesh più complessa. Perché non replicare lo stesso scenario? Il modello Susan è facile da ottenere.
Bart,

Non è così facile in un'implementazione shadertoy! (:
Alan Wolfe,

2
Il cubo mi sembra corretto: diventa più trasparente man mano che si avvicina ai bordi. Se riesci a fare Suzanne in piena regola, la sfera a dovrebbe almeno dare una migliore approssimazione dell'aspetto nell'altra foto.
yuriks,

1
Non riesco a separare la rifrazione dall'attenuazione. Puoi rendere il cubo con IOR = 1.0 per favore?
imallett,

1
@AlanWolfe Il tuo rendering IOR = 1 sembra esattamente come me lo sarei aspettato, e ho scremato l'implant shadertoy e sembra buono.
imallett,

Risposte:


12

L'immagine sicuramente non sembra corretta e sembra che tu non stia calcolando correttamente il percorso interno dei raggi luminosi mentre viaggiano attraverso la tua mesh. A quanto pare, direi che stai calcolando la distanza tra il punto in cui il raggio di vista entra per la prima volta nel cubo e dove colpisce per primo la parete interna, e utilizzalo come distanza di assorbimento. Ciò presuppone essenzialmente che la luce uscirà sempre dal vetro la prima volta che colpisce un muro, il che è una cattiva ipotesi.

In realtà, quando la luce entra nel vetro dall'aria, spesso non esce immediatamente dal vetro. Questo perché quando la luce colpisce l'interfaccia vetro / aria, può verificarsi un fenomeno noto come riflessione interna totale (TIR). Il TIR si verifica quando la luce viaggia da un mezzo con un indice di rifrazione (IOR) più elevato a uno con uno IOR inferiore, che è esattamente ciò che accade nel caso della luce che colpisce la parete interna di un oggetto di vetro. Questa immagine da Wikipedia è una buona dimostrazione visiva di come appare quando si presenta:

riflessione interna totale

In termini di base, ciò significa che se la luce colpisce un angolo poco profondo, la luce si rifletterà completamente dall'interno del mezzo. Per tenere conto di ciò, è necessario valutare le equazioni di Fresnelogni volta che il raggio di luce colpisce un'interfaccia vetro / aria (AKA la superficie interna della tua maglia). Le equazioni di Fresnel indicheranno il rapporto tra luce riflessa e quantità di luce rifratta, mentre sarà 1 nel caso di TIR. È quindi possibile calcolare le direzioni della luce riflessa e rifratta appropriate e continuare a tracciare il percorso della luce attraverso il mezzo o all'esterno di essa. Se si assume una semplice maglia convessa con un coefficiente di dispersione uniforme, la distanza da utilizzare per la legge di Beer sarà la somma di tutte le lunghezze del percorso interno prima di uscire dal mezzo. Ecco come appare un cubo con i tuoi coefficienti di scattering e IOR di 1.526 (vetro soda lime), reso usando il mio tracciatore di percorsi che tiene conto delle riflessioni e delle rifrazioni sia interne che esterne:

cubo di vetro tracciato

In definitiva i riflessi interni e le rifrazioni sono una parte importante di ciò che fa sembrare il vetro vetro. Le approssimazioni semplici non lo tagliano, come hai già scoperto. È ancora peggio se si aggiungono più mesh e / o mesh non convesse, poiché non si deve solo tenere conto dei riflessi interni, ma anche tenere conto dei raggi che lasciano il mezzo e inserirlo in un altro punto.


1
Here is what a cube looks like (...) using my own path tracer. Ti capita di averlo aperto per caso?
pulire il

2
No, non ancora. Avevo intenzione di finire e rilasciare questa particolare variante insieme a un post sul blog sulla resa del vetro, ma è stato sul mio backlog per un po '.
MJP,
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.