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:
Ile światła odbija w stosunku do załamań światła jest podanych przez równania Fresnela
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.
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.
źródło
Odpowiedzi:
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:
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.
źródło