Wybór odbicia lub załamania w śledzeniu ścieżki

14

Próbuję zaimplementować załamanie i transmisję w moim znaczniku ścieżki i jestem nieco niepewny, jak to zaimplementować. Najpierw trochę tła:

Kiedy światło uderza w powierzchnię, jej część odbija się, a część ulega załamaniu: wprowadź opis zdjęcia tutaj

Ile światła odbija w stosunku do załamań światła jest podanych przez równania Fresnela wprowadź opis zdjęcia tutaj

W rekursywnym znaczniku promienia prostą implementacją byłoby wystrzelenie promienia w celu odbicia i promienia w celu załamania, a następnie wykonanie ważonej sumy za pomocą Fresnela.

R=Fresnel()T=1RLo=RLi,reflection+TLi,refraction

Jednak w śledzeniu ścieżki wybieramy tylko jedną ścieżkę. Oto moje pytanie:

  • Jak wybrać, czy ma się odbijać czy załamywać w sposób niestronny

Moim pierwszym przypuszczeniem byłoby losowe wybranie na podstawie Fresnela. Znany jako:

float p = randf();
float fresnel = Fresnel();
if (p <= fresnel) {
    // Reflect
} else {
    // Refract
}

Czy to byłoby poprawne? Czy też muszę mieć jakiś współczynnik korygujący? Ponieważ nie obieram obu ścieżek.

RichieSams
źródło
rosyjska ruletka
v.oddou

Odpowiedzi:

6

TL; DR

Tak, możesz to zrobić w ten sposób, wystarczy podzielić wynik przez prawdopodobieństwo wyboru kierunku.

Pełna odpowiedź

Temat próbkowania w znacznikach ścieżki pozwalających na materiały zarówno z odbiciem, jak i refrakcją jest w rzeczywistości nieco bardziej złożony.

Zacznijmy od pewnego tła. Jeśli zezwalasz na BSDF - nie tylko BRDF - w swoim znaczniku ścieżki, musisz zintegrować całą sferę zamiast dodatniej półkuli. Próbki Monte Carlo można generować za pomocą różnych strategii: w przypadku bezpośredniego oświetlenia można użyć BSDF i próbkowania światła, w przypadku oświetlenia pośredniego jedyną znaczącą strategią jest zwykle próbkowanie BSDF. Same strategie próbkowania zazwyczaj zawierają decyzję o tym, którą półkulę należy pobrać (np. Czy obliczane jest odbicie czy załamanie).

W najprostszej wersji próbkowanie światła zwykle nie dba o odbicie lub załamanie światła. Próbkuje źródła światła lub mapę środowiska (jeśli jest obecna) w odniesieniu do właściwości światła. Możesz poprawić próbkowanie map środowiska, wybierając tylko półkulę, w której materiał ma niezerowy udział, ale reszta właściwości materiału jest zwykle ignorowana. Pamiętaj, że w przypadku idealnie gładkiego materiału Fresnela próbkowanie światła nie działa.

W przypadku próbkowania BSDF sytuacja jest znacznie bardziej interesująca. Opisany przez ciebie przypadek dotyczy idealnej powierzchni Fresnela, w której są tylko dwa kierunki przyczyniające się (ponieważ Fresnel BSDF jest w rzeczywistości tylko sumą dwóch funkcji delta). Możesz łatwo podzielić całkę na sumę dwóch części - jednej odbicia i jednej do załamania. Ponieważ, jak już wspomniałeś, nie chcemy iść w obu kierunkach za pomocą znacznika ścieżki, musimy wybrać jeden. Oznacza to, że chcemy oszacować sumę liczb, wybierając tylko jedną z nich. Można tego dokonać poprzez dyskretne oszacowanie Monte Carlo: losowo wybierz jeden z dodatków i podziel go przez prawdopodobieństwo, że zostanie wybrany. W idealnym przypadku chcesz mieć prawdopodobieństwo próbkowania proporcjonalne do dodatków, ale ponieważ nie znamy ich wartości (nie musielibyśmy oszacować sumy, gdybyśmy je znali), po prostu oceniamy je, zaniedbując niektóre czynniki. W tym przypadku ignorujemy ilość przychodzącego światła i używamy tylko współczynnika odbicia / transmitancji Fresnela jako naszych oszacowań.

Procedura pobierania próbek BSDF w przypadku gładkiej powierzchni Fresnela polega zatem na losowym wybieraniu jednego z kierunków z prawdopodobieństwem proporcjonalnym do współczynnika odbicia Fresnela i, w pewnym momencie, dzieleniu wyniku dla tego kierunku przez prawdopodobieństwo wybrania kierunku. Estymator będzie wyglądał następująco:

Li(ωi)F(θi)P(ωi)=Li(ωi)F(θi)F(θi)=Li(ωi)

Gdzie to wybrany kierunek światła padającego, to ilość promieniowanie padające, jest albo współczynnikiem odbicia Fresnela dla przypadku odbicia, albo 1 - współczynnikiem odbicia Fresnela dla przypadku refrakcji, jest prawdopodobieństwem dyskretnym wyboru kierunku i jest równy .ωi=(ϕi,θi)Li(ωi)F(θi)P(ωi)F(θi)

W przypadku bardziej wyrafinowanych modeli BSDF, takich jak te oparte na teorii mikropacet, próbkowanie jest nieco bardziej złożone, ale zwykle można również zastosować pomysł podzielenia całej całki na skończoną sumę subintegrałów i późniejszego zastosowania dyskretnego Monte Carlo.

ivokabel
źródło
1
To interesujące, ale jestem zdezorientowany jednym punktem. Czy możesz wyjaśnić, co to znaczy „podzielić wynik dla tego kierunku przez prawdopodobieństwo wybrania kierunku”? Jeśli nie jest to wybór binarny, ale kierunek wybrany z ciągłego rozkładu, czy prawdopodobieństwo nie będzie wynosić zero?
trichopaks
1
@trichoplax: Tak, ale w tym akapicie opisałem technikę próbkowania tylko dla (dielektrycznego) Fresnela BSDF - idealnie gładkiej powierzchni, która jest sumą dwóch funkcji delta Diraca. W takim przypadku wybierasz jeden z kierunków z pewnym dyskretnym prawdopodobieństwem. W przypadku BSDF nieokreślonego (skończonego) generujesz kierunki zgodnie z funkcją gęstości prawdopodobieństwa. Niestety, przypadki delta i inne niż delta muszą być obsługiwane osobno, co powoduje, że kod jest nieco nieporządny. Więcej informacji na temat pobierania próbek BSDF z mikrofacet można znaleźć na przykład w Walter i in. glin. [2007] papier.
ivokabel
2
@RichieSams: Walter i in. glin. [2007] jest w dalszym ciągu najnowszym stanem techniki dla chropowatych powierzchni dielektrycznych, ale aby działało dobrze, potrzebujesz dobrego próbkowania, które niedawno opublikowali Heitz i D'Eon w artykule z 2014 r. „Ważność próbkowania BSDF na bazie mikrofiletów przy użyciu rozkładu widocznych norm ”. I zauważ, że jest to model z pojedynczym rozpraszaniem, który pomija odbicia między mikropacetami, czyniąc je wyraźnie ciemnym dla wyższych wartości chropowatości. Zobacz moje pytanie „Kompensacja strat energii w modelach BSDF z pojedynczym rozproszeniem”.
ivokabel
5
Chciałem tylko zaznaczyć, że jeśli wybierzesz prawdopodobieństwo = fresnel () zgodnie z sugestią pytania, a następnie dzieląc przez prawdopodobieństwo, anulujesz współczynnik Fresnela, który normalnie byłby pomnożony. Więc (w dyskretnym przypadku dwu-Diraca ) otrzymujesz wkład promienia, który w ogóle nie uwzględnia czynnika Fresnela. Jest to standardowa teoria pobierania próbek według ważności, ale pomyślałem, że wskazałbym to jako potencjalnie zagmatwany problem.
Nathan Reed
2
@Nathan, włączyłem twoje zawiadomienie do odpowiedzi.
ivokabel