Czy próbkowanie półkuli ważonej kosinusiem nadal wymaga NdotL przy obliczaniu udziału światła pośredniego?

12

Przechodząc z jednolitego próbkowania półkuli na ważone cosinusiem próbkowanie półkuli, jestem zdezorientowany stwierdzeniem w artykule.

Mój obecny wkład pośredni jest obliczany jako:

Vec3 RayDir = UniformGenerator.Next()
Color3 indirectDiffuse = Normal.dot(RayDir) * castRay(Origin, RayDir)

Gdzie iloczyn skalarny to cos (θ)

Ale w tym artykule na temat lepszego próbkowania ( http://www.rorydriscoll.com/2009/01/07/better-sampling/ ) autor sugeruje, że plik PDF to (cos (θ) / pi) i nie ma dowodów na obliczenie N kropki L.

Moje pytanie brzmi - czy to oznacza, że ​​nie muszę już wykonywać normalnej kropki rayDirection, ponieważ jest ona zawarta w pliku PDF, czy też jest dołączona do pliku pdf?

Steven
źródło

Odpowiedzi:

12

Rzeczywiście zawsze trzeba pomnożyć przez cosinus (to część równania renderowania). Chociaż w przypadku rozpraszania pośredniego za pomocą śledzenia promieni, a tym samym integracji monte-carol (co jest w tym przypadku najczęściej stosowaną techniką), należy podzielić udział każdej próbki przez plik PDF . Jest to dobrze zbadane tutaj .

Zauważ też, że we wspomnianym odnośniku, jeśli plik PDF zawiera warunki, które znajdują się również w równaniach renderowania, możesz zoptymalizować kod, jeśli chcesz, anulując te warunki.

Nie zapominaj, że BRDF powierzchni rozproszonej wynosi ρ / π, gdzie ρ oznacza albedo powierzchni. Więc musimy podzielić wynik przez π. Chociaż w przypadku pośredniego składnika rozproszonego nie należy zapominać, że powinniśmy podzielić wynik castRay przez PDF zmiennej losowej, który, jak pokazaliśmy wcześniej w tym rozdziale, to 1 / (2π). Dzieląc pośrednioDiffuseby przez 1 / (2π) mylnie to samo, co mnożenie tej wartości przez 2π. A ponieważ albedo jest również podzielone przez π, możemy uprościć kod ...

Masz podobną sytuację. Jeśli spojrzysz na plik PDF z próbkowaniem cosinusa, zrozumiesz, że warunki można anulować. Co nie znaczy, że nie są absolutnie konieczne. Są, po prostu się znoszą, co pozwala nieco zoptymalizować kod (i uniknąć kilku podziałów, mnożenia itp.). Jesteś tutaj bardziej w mikrooptymalizacji ... co może być mylące, jeśli spróbujesz nauczyć się teorii, patrząc tylko na zoptymalizowany kod (który często nie jest odpowiednio komentowany).

(cos(θ)...)PDF=(cos(θ)...)cos(θ)π=...

użytkownik18490
źródło
1
Dziękuję Ci! To ma sens. Intuicyjnie wiedziałem, że jest to wymagane, ale nie wiedziałem, że była to optymalizacja.
Steven
5
Aby się upewnić, że jest to jednoznaczne ... półkula ważona cosinusem jest nie tylko optymalizacją, ponieważ wymaga mniej instrukcji, ale także optymalizacją, ponieważ szybciej się zbiera. Aby uzyskać lepszy wynik, potrzeba mniej próbek. Jest to forma ważnego próbkowania.
Alan Wolfe
Dokładnie - to było moje pragnienie, gdy próbuję zmniejszyć liczbę próbek do pośrednich obliczeń w moim lightmapper.
Steven