2011-12-09

Przeźroczyste cienie

Wraz z dodaniem materiałów przeźroczystych pojawiła się potrzeba dodania czegoś co można by nazwać półprzeźroczystymi cieniami. Na takim materiale promień światła ulega załamaniu. W obecnym stanie raytracera, kiedy nie ma globalnego modelu oświetlenia nie możemy tego efektu uwzględnić podczas obliczania czy punkt jest w cieniu światła. Musimy więc ucieć się do triku. Wypuszczamy z miejsca uderzenia promień w kierunku źródła światła i badamy wszystkie intersekcje po drodze. W przypadku natrafienia na materiał nieprzepuszczalny punkt jest w cieniu dla tego żródła światła. Na każdym materiale półprzeźroczystym dokonujemy modyfikacji koloru światła. Lolor światła modyfikujemy także w zależności od tłumienia ośrodka. Obie modyfikacje koloru światła są niezależne od siebie oraz są niezależne od kolejności w jakich ich dokonujemy. Możemy więc poruszać się od miejsca uderzenia do źródła światła (jak i w druga stronę). Promień na materiale półprzeźroczystym nie ulega załamaniu.

Co możemy zrobić w przypadku uderzenia w materiał półprzeźroczysty. Możemy pomniejszyć kolor światła źródła o transmitancje materiału. Możemy pomniejszyć go o wartość kosinusa kąta pomiędzy normalną, a kierunkiem promienia symulując tym samym ubytek energii promienia w wyniku rozproszenia. Możemy wreszcie uwzględnić efekt Fresnella.

Wszystkie wspomniane metody zostały zaimplementowane jako osobne klasy wywodzące się z ShadowTester. Jest to specjalna klasa do ustalania koloru światła w punkcie uderzenia.

Pierwszy najprostszy tester SolidShadowTester nie implementuje przeźroczystych cieni. Drugi AttenuationShadowTester uwzględnia tłumienie ośrodka. Trzeci AttenuationTransmittanceShadowTester dodatkowo uwzględnia trasmitancje materiału. Czwarty AttenuationTransmittanceAngleShadowTester bierze pod uwagę kąt padania promienia do normalnej. Przy czym dla bardziej realistycznego efektu podnoszony jest on do potęgi Constants.TRANSFLUENT_SHADOWS_ANGLE_POWER_EXPONENT=0.25. Ponieważ wartości kąta zawierają się od 0 do 1, wyginamy więc krzywą tak, że $cos^{0.25}>cos$. Cienie są więc o wiele bardziej jasne, i w ten sposób są bardziej realistyczne. Ostatni tester AttenuationTransmittanceAngleFresnellShadowTester w warunkach lokalnego oświetlenia okazał się najgorszy. Potrafi wygenerować całkowicie ciemne cienie w wyniku całkowitego wewnętrznego odbicia. Ale zostawiłem go mimo wszystko dla porównania.

Brak komentarzy:

Prześlij komentarz