HLSL półprzezroczysty plastikowy shader

12

Próbuję wyprodukować moduł cieniujący do odtworzenia białego plastikowego obiektu z kolorowym światłem w środku. Albo przez posiadanie cieniowania, które będzie półprzezroczyste i jeśli umieszczę światło wewnątrz obiektu, światło przejdzie przez niego lub przez cieniowanie, które udaje efekt światła wewnątrz.

Efekt, który zamierzam, jest trochę jak światło przechodzące przez abażur podobne do tych zdjęć:

alternatywny tekst alternatywny tekst alternatywny tekst

Idealnie byłbym w stanie kontrolować siłę i kolor światła, aby pulsowało i obracało się przez niektóre ładne jasne kolory fluro

Chociaż nie jestem pewien, od czego zacząć!

Moje pytanie brzmi: czy ktoś zna techniki, które powinienem badać, aby móc wyprodukować taki moduł cieniujący lub czy mam przykład tego samego / podobnego modułu cieniującego, którego mogę użyć jako punktu wyjścia? Lub nawet jeśli chcesz udostępnić moduł cieniujący, który może wykonać zadanie

Tristan
źródło

Odpowiedzi:

10

Jest to efekt znany jako „rozproszenie podpowierzchniowe”.

Przykładowa implementacja tego miejsca na ekranie znajduje się w książce „GPU Pro: Zaawansowane techniki renderowania”, która jest odpowiednia do użytku w czasie rzeczywistym.

Tony McCrary
źródło
0

Nie znam HLSL, więc nie mogę podać dokładnej odpowiedzi. To, co możesz w zasadzie zrobić, to ustawić kolor każdego fragmentu w zależności od odległości od źródła światła (ignorując wszelkie samo-cienie).

W pseudokodzie byłoby to mniej więcej tak:

fragment_kolor = jasność_intensywność * przezroczystość_kolor * lightsource_color / (tłumienie * odległość_do_swietlenia ^ 2)

Możesz również użyć liniowego współczynnika tłumienia oprócz kwadratu, aby światło rozproszyło się bardziej.

Danik
źródło
0

Czy światło musi się poruszać, a obiekt musi się deformować / animować? Jeśli tak nie jest, tanim sposobem byłoby nałożenie monochromatycznej mapy tekstury na obiekt, który działa jak maska ​​światła; w module cieniującym próbkujesz tę teksturę, pomnóż ją przez bieżący kolor / siłę światła i dodaj do koloru wyjściowego.

Oczywistym pytaniem jest, w jaki sposób wygenerujesz tę teksturę? Możesz spróbować go pomalować, jeśli masz dostęp do artysty lub możesz samodzielnie malować tekstury. Może to być również renderowane przez narzędzie offline przy użyciu raytracingu lub podobnego. Jednak nie znam wystarczająco narzędzi do śledzenia promieni, aby szczegółowo powiedzieć, jak to skonfigurować.

Innym podejściem może być napisanie modułu cieniującego, który próbkuje światło za nim, używając odwróconej powierzchni normalnej w regularnym równaniu cieniowania rozproszonego Lamberta; następnie pomnożymy go przez jakiś współczynnik maski, taki jak około 0,5 i dodasz do koloru wyjściowego. Umożliwiłoby to dynamiczne przesuwanie światła lub geometrii i nie wymagałoby tekstur, ale prawdopodobnie nie uzyskałbyś wyników tak ładnych jak renderowanie offline.

Odnośnie rozpraszania podpowierzchniowego: nie sądzę, że właśnie tego tutaj potrzebujemy, ponieważ wszystkie algorytmy SSS dla grafiki, które widziałem, są zaprojektowane dla światła, które pochodzi z zewnątrz , odbija się nieco i wychodzi ponownie, podczas gdy tutaj światło jest w środku .

Nathan Reed
źródło