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?


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.