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):
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ęć:
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?
3d
refraction
transparency
Alan Wolfe
źródło
źródło
Odpowiedzi:
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:
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:
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.
źródło
Here is what a cube looks like (...) using my own path tracer.
Czy zdarzyło Ci się, że masz otwarte źródła?