Kosinüs ağırlıklı yarımküre örneklemesi, dolaylı ışığın katkısını hesaplarken hala NdotL gerektirir mi?


12

Düzgün yarımküre örneklemesinden kosinüs ağırlıklı yarımküre örneklemesine dönüştürürken bir makaledeki bir ifadeyle kafam karıştı.

Mevcut dolaylı katkım şu şekilde hesaplanır:

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

Nokta ürününün cos olduğu yer (θ)

Ancak daha iyi örnekleme hakkındaki bu makalede ( http://www.rorydriscoll.com/2009/01/07/better-sampling/ ) yazar, PDF'nin (cos (θ) / pi) olduğunu öne sürüyor ve N nokta L hesaplaması.

Sorum şu - bu PDF'de yer aldığından artık normal dot rayDirection uygulamasına gerek duymayacağım anlamına mı geliyor, yoksa pdf'ye ek olarak mı?

Yanıtlar:


12

Her zaman gerçekten kosinüs terimi ile çarpmanız gerekir (bu, oluşturma denkleminin bir parçasıdır). Eğer (bu durumda en yaygın tekniktir olan) ışın izleme ve böylece monte-Carol entegrasyonu kullanarak dolaylı diffüz yaptığınızda rağmen, gerek bölmek için her numunenin katkısını PDF . Bu burada çok iyi örneklenmiş .

Bahsedilen referansta, PDF'nin oluşturma denklemlerinde de bulduğunuz terimler varsa, bu terimleri iptal ederek kodu optimize edebileceğinizi de unutmayın.

Dağınık bir yüzeyin BRDF'sinin ρ / π olduğunu unutmayın; burada ρ, yüzey albedo'dur. Bu yüzden sonucu π ile bölmeliyiz. Dolaylı dağınık bileşen söz konusu olsa da, castRay'in sonucunu bu bölümde daha önce gösterdiğimiz gibi 1 / (2π) olan rastgele değişkenin PDF'sine bölemeliyiz. Dolaylı Difüzyonu 1 / (2π) bölmek, bu değeri 2 by ile çarpmakla aynıdır. Ve albedo da π ile bölündüğünden kodu basitleştirebiliriz ...

Benzer bir durum var. Kosinüs örneklemesi için PDF'ye bakarsanız, terimlerin iptal edilebileceğini anlayacaksınız. Bu kesinlikle gerekli olmadıkları anlamına gelmez. Onlar, sadece kodu hafifçe optimize etmeyi sağlayan (ve birkaç bölme, çarpma vb. Burada mikro-optimizasyonda daha fazlasınız ... teoriyi sadece optimize edilmiş koda bakarak öğrenmeye çalışırsanız kafa karıştırıcı olabilir (ki bu genellikle doğru yorumlanmamıştır).

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


1
Teşekkür ederim! Mantıklı. Sezgisel olarak bunun gerekli olduğunu biliyordum ama bunun bir optimizasyon olduğunu bilmiyordum.
Steven

5
Sadece bunun açık olduğundan emin olmak için .. sadece kosinüs ağırlıklı yarımküre bir optimizasyon değildir, çünkü daha az talimat alır, aynı zamanda bir optimizasyon daha hızlı bir şekilde birleşir. Daha iyi bir sonuç almak için daha az örnek gerekir. Bu önemli bir örnekleme şeklidir.
Alan Wolfe

Tam olarak - benim ışık haritamdaki dolaylı hesaplamalar için örnek sayısını azaltmaya çalıştığım için bu benim arzumdu.
Steven
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.