Jak uzyskać światło zmieniające kolor w połowie drogi?

11

Myślałem o stworzeniu źródeł światła i kilku kolorowych okien. Teraz okna są półprzezroczyste. Jak mogę to zrobić, aby światło (powiedzmy czysta biel) uderzyło w szybę i przechodzi przez nią, ale zmieniło kolor na ten sam kolor, co szkło, które przeszło?

Wiem, że opisany tutaj efekt można sfałszować za pomocą świateł obszarowych po „kolorowej” stronie okna, ale co jeśli chciałbym mieć tylko jedno białe światło punktowe?

manabreak
źródło
Czy zamiast zmieniać kolor światła, mógłbyś zmienić podstawowy kolor podświetlanych obiektów po drugiej stronie szkła? może to załatwi sprawę?
HumanCatfood
Przezroczyste okno jest renderowane jako drugie przejście, jego moduł cieniujący po prostu modyfikuje równowagę kolorów każdego wyjściowego piksela. Czy to nie zadziała?
Patrick Hughes,
Wydaje mi się, że jest to analogiczne do problemu cieni; jeśli masz ładny algorytm dla cieni rzucanych przez półprzezroczyste obiekty (nie wiem, czy to praktyczne), wystarczy uruchomić go dla trzech równoległych kanałów kolorów.
Kevin Reid,

Odpowiedzi:

14

Jest na to wiele sposobów. Będą one wymagały użycia modułu cieniującego i przypuszczam, że już robisz oświetlenie na piksel. Poniżej przedstawiono kilka sugestii, jednak znalezienie odpowiedniej techniki może wymagać znacznie więcej badań.

Szybko i brudno

Możesz określić obwiednie, które definiują obszary wewnętrzne. Jeśli światło znajduje się poza ramkami, ale geometria (która nie jest w cieniu) znajduje się wewnątrz ramki, na światło musiało wpłynąć przejście przez okno (jest to również prawdą, jeśli geometria znajduje się poza ramką i światło jest w środku). Jedynym problemem jest to, jak przekazać informacje o polu do modułu cieniującego i jak określić wpływ na światło.

Inną opcją jest określenie okien jako obiektów leżących na płaszczyznach. Najpierw sprawdź, czy geometria i światło znajdują się po przeciwnych stronach płaszczyzny, a następnie, czy droga między nimi przecina płaszczyznę w punkcie w granicach okna. Byłoby to dokładniejsze niż pierwsza metoda i łatwiej byłoby mieć okna do tych samych wnętrz o różnych kolorach szkła.

Coraz bardziej szczegółowe z geometryczną reprezentacją okien, a otrzymasz dokładniejsze wyniki, ale obliczenia będą również cięższe.

Techniki te działałyby całkiem dobrze w strzelance na korytarzu, ale nie tak dobrze w przypadku dynamicznego lub otwartego świata, ponieważ prawdopodobnie konieczne byłoby wiele poprawek, aby wyglądał dobrze bez zbyt wielu artefaktów. Ponadto techniki te mogą szybko stać się nieco intensywne, dlatego zaleca się przejście na odroczony proces cieniowania.

Mapy cienia

Inną opcją jest zrobienie czegoś podobnego do mapowania cienia.

Podczas mapowania cienia generujesz bitmapę obrazu świata dotkniętego światłem. Każdy piksel, choć nadal jest kolorem, jest w rzeczywistości odległością najbliższego kawałka nieprzezroczystej geometrii (używasz czterech bajtów na 1 zmiennoprzecinkową zamiast 4 kolorów). Jeśli obliczasz odległość od światła do kawałka geometrii i jest ona większa niż odpowiednia wartość na mapie cienia, wówczas twój fragment geometrii znajduje się w cieniu (zazwyczaj używasz promienia między geometrią a światłem do indeksowania mapy).

Jeśli zastosujesz ten pomysł w swoim problemie, zapisz mapę odległości od światła najbliższego kawałka przezroczystej geometrii, a następnie wykonaj drugą mapę koloru światła po przejściu przez tę geometrię ( po prostu kolor geometrii, jeśli światło jest białe).

Jeśli kawałek geometrii znajduje się dalej niż odległość na tej mapie, użyj koloru mapy, jeśli nie, użyj oryginalnego jasnego koloru.

Funkcja do obliczania koloru dla każdego piksela na mapie powinna z grubsza być; lightColor - invertedWindowColor. A więc dla czystego białego światła i czystego czerwonego okna, które nie pochłania żadnego czerwonego widma, które otrzymujemy; (255,255,255) - (0,255,255) = (255,0,0). Tak więc kolor światła po drugiej stronie jest czysto czerwony. W przypadku bardziej złożonych obiektów przezroczystych, takich jak witraże, może być konieczne sprawdzenie tekstury w celu uzyskania koloru materiału.

Jeśli szukasz czegoś podobnego, sprawdź Odblaskowe mapy cienia .

Ta technika zapewnia dużą wierność i prawdopodobnie byłaby najlepsza, jeśli chcesz zastosować złożoną przezroczystą geometrię, taką jak witraże.

Próba rozwiązania ogólnego

Ostatnio popularne stało się kodowanie informacji o oświetleniu w reprezentacji wokseli (nie tylko dla geometrii). Najnowszy silnik crytek wykorzystuje ten rodzaj strategii do zaawansowanego oświetlenia ( wielkości propagacji światła ).

Oto ogólny pomysł:

  • Utwórz mapę równomiernie rozmieszczonych sześcianów, która obejmie Twoją scenę (rozważ użycie krzywych w kolejności Z ).
  • Znajdź sposób przechowywania informacji o oświetleniu padającym dla każdego woksela (przydatne są tutaj reprezentacje harmonicznych sferycznych).
  • Znajdź woksel zawierający światło i reprezentuj to światło w wokselu.
    • Propaguj światło na zewnątrz przez sąsiednie woksele (coś w rodzaju wody minecrafta)
    • Oblicz, w jaki sposób geometria każdego woksela wpłynie na przechodzące przez niego światło (absorbuj, odbijaj, przesyłaj)
    • powtarzaj, aż światło zgaśnie

Istnieje wiele sposobów budowania tej informacji o wokselach, ale powyższa lista zawiera ogólny pomysł. Na przykład; możesz zacząć od wygenerowania map cieni / objętości, a następnie rzutowania tych informacji na mapę wokseli, aby szybko stworzyć mapę bezpośredniego oświetlenia. Następnie rozpoczynasz rozmowę od wokseli wzdłuż krawędzi dotkniętego obszaru. Pamiętaj, że w tym przypadku będziesz chciał zignorować, czy geometria jest przezroczysta, czy nie podczas generowania mapy / objętości cienia.

W ostatnim przejściu odroczonego renderera, obliczając oświetlenie punktu geometrii, wystarczy użyć pozycji geometrii, aby zindeksować mapę wokseli, aby dowiedzieć się, jak wygląda oświetlenie padające w tym punkcie przestrzeni. Następnie możesz zbudować mapę ekranu po stronie procesora oświetlenia incydentalnego lub ewentualnie zrobić to za pomocą cuda.

OriginalDaemon
źródło
Dzięki za długi post! Obecnie badam, czy będę wykonywać renderowanie do przodu, czy odroczone dla bieżącego projektu, nad którym pracuję. W tej chwili prawdopodobnie zostanie odroczony. Jak byś zrobił, gdy okno jest wielokolorowe (np. Witraż w kościele)?
manabreak
@manabreak - Chciałbym użyć rozszerzenia mapy cienia, ponieważ zapewniłoby to najlepszy poziom wierności w tym przypadku. Zmienię post, aby to wyjaśnić.
OriginalDaemon,
Ojej dzięki! Ten post naprawdę zrobił mi dzień, prawdopodobnie nigdy nie widziałem tylu wysiłków włożonych w żaden pojedynczy post.
manabreak