Czy to właściwy sposób na wdrożenie prawa piwa?

11

Kiedy wdrażam prawo Beer'a (pochłanianie kolorów na odległość przez obiekt), z jakiegoś powodu nigdy nie wygląda to bardzo dobrze.

Kiedy mam kolor za obiektem, obliczam dopasowany kolor w następujący sposób:

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

To da mi coś, co wygląda tak (zwróć uwagę na zastosowane załamanie): wprowadź opis zdjęcia tutaj

I tutaj jest bez załamania: wprowadź opis zdjęcia tutaj

Zauważ, że ten jest realizowany jako shaderów zabawki tutaj .

Jest to zgodne z opisem działania prawa Beera, ale nie wygląda bardzo dobrze, nie w porównaniu do takich ujęć: wprowadź opis zdjęcia tutaj

Odkładając na bok szczegóły, próbuję zrozumieć różnicę. Czy to możliwe, że moja geometria jest zbyt prosta, aby naprawdę dobrze ją pokazać? Czy też wdrażam go nieprawidłowo?

Alan Wolfe
źródło
2
Jednak porównujesz sześcian z bardziej złożoną siatką. Dlaczego nie powielić tego samego scenariusza? Model Susan jest łatwy do zdobycia.
Bart,
W implementacji shadertoy nie jest to takie proste! (:
Alan Wolfe,
2
Twoja kostka wygląda dla mnie poprawnie: Stań się bardziej przezroczysty, gdy zbliża się do krawędzi. Jeśli możesz zrobić pełnowymiarową Suzanne, kula powinna przynajmniej lepiej przybliżać wygląd na drugim zdjęciu.
yuriks,
1
Nie mogę oddzielić refrakcji od tłumienia. Czy potrafisz wyrenderować sześcian z IOR = 1.0?
imallett
1
@AlanWolfe Twój rendering IOR = 1 wygląda dokładnie tak, jak bym tego oczekiwał, i przesunąłem implant shadertoy i wygląda dobrze.
imallett

Odpowiedzi:

12

Twój obraz zdecydowanie nie wygląda poprawnie i wydaje się, że nie obliczasz prawidłowo wewnętrznej ścieżki promieni świetlnych, gdy przemieszczają się one przez twoją siatkę. Patrząc na to, powiedziałbym, że obliczasz odległość między punktem, w którym promień widzenia najpierw wchodzi do sześcianu, a miejscem, w którym najpierw uderza w ścianę wewnętrzną, i wykorzystujesz to jako odległość absorpcji. Zasadniczo zakłada to, że światło zawsze wychodzi ze szkła za pierwszym razem, gdy uderza w ścianę, co jest złym założeniem.

W rzeczywistości, gdy światło dostaje się do szkła z powietrza, często nie natychmiast wychodzi ono ze szkła. Wynika to z faktu, że gdy światło pada na interfejs szkło / powietrze, może wystąpić zjawisko znane jako całkowite odbicie wewnętrzne (TIR). TIR pojawia się, gdy światło przemieszcza się z ośrodka o wyższym współczynniku załamania (IOR) do ośrodka o niższym IOR, co dzieje się dokładnie w przypadku padania światła na wewnętrzną ścianę szklanego obiektu. Ten obraz z Wikipedii stanowi dobrą wizualną demonstrację tego, jak wygląda:

całkowite odbicie wewnętrzne

Mówiąc w skrócie, oznacza to, że jeśli światło uderzy pod niewielkim kątem, światło całkowicie odbije się od wnętrza ośrodka. Aby to uwzględnić, musisz ocenić równania Fresnelaza każdym razem, gdy twój promień światła uderza w interfejs szkło / powietrze (AKA wewnętrzna powierzchnia siatki). Równania Fresnela podadzą ci stosunek światła odbitego do ilości światła załamanego, podczas gdy będą wynosić 1 w przypadku TIR. Następnie możesz obliczyć odpowiednie kierunki światła odbitego i załamanego i kontynuować śledzenie ścieżki światła przez medium lub poza nim. Jeśli przyjmiesz prostą wypukłą siatkę o jednolitym współczynniku rozproszenia, to odległość do zastosowania dla prawa Beera będzie sumą wszystkich wewnętrznych długości ścieżek przed opuszczeniem ośrodka. Oto jak wygląda sześcian z współczynnikami rozpraszania i IOR 1,526 (szkło sodowo-wapniowe), renderowanymi przy użyciu mojego znacznika ścieżki, który uwzględnia zarówno wewnętrzne, jak i zewnętrzne odbicia i załamania:

sześcian szklany

Ostatecznie wewnętrzne odbicia i załamania są główną częścią tego, co sprawia, że ​​szkło wygląda jak szkło. Proste przybliżenia tak naprawdę tego nie wycinają, jak już się przekonałeś. Jest jeszcze gorzej, jeśli dodasz wiele oczek i / lub niewypukłe siatki, ponieważ nie tylko musisz uwzględnić wewnętrzne odbicia, ale także uwzględnić promienie, które opuszczają medium i wchodzą do niego w innym punkcie.

MJP
źródło
1
Here is what a cube looks like (...) using my own path tracer. Czy zdarzyło Ci się, że masz otwarte źródła?
wytrzyj
2
Nie, jeszcze nie. Planowałem dokończyć i wydać ten konkretny wariant wraz z postem na blogu o renderowaniu szkła, ale od dłuższego czasu jest to zaległe.
MJP