Yol İzlemede Yansıma veya Kırılma Seçme


14

Yol izleyicimde kırılma ve iletimi uygulamaya çalışıyorum ve bunu nasıl uygulayacağımdan biraz emin değilim. İlk olarak, biraz arka plan:

Işık bir yüzeye çarptığında, bir kısmı yansıyacak ve bir kısmı kırılacaktır: resim açıklamasını buraya girin

Fresnel Denklemleri tarafından ışığın ne kadar yansıtıcıya karşı yansıdığı verilir. resim açıklamasını buraya girin

Özyinelemeli ışın izleyicide, basit uygulama yansıma için bir ışın ve kırılma için bir ışın çekmek, daha sonra Fresnel'i kullanarak ağırlıklı bir toplam yapmak olacaktır.

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

Ancak, yol izlemede yalnızca bir yol seçiyoruz. Bu benim sorum:

  • Önyargısız bir şekilde yansıtmayı veya kırmayı nasıl seçerim

İlk tahminim Fresnel'e göre rastgele seçmektir. Diğer adıyla:

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

Bu doğru olur mu? Yoksa bir çeşit düzeltme faktörüne ihtiyacım var mı? İki yolu da izlemediğim için.


rus ruleti
v.oddou

Yanıtlar:


6

TL; DR

Evet, bunu böyle yapabilirsiniz, sonucu yönü seçme olasılığına bölmeniz yeterlidir.

Tam Yanıt

Hem yansıma hem de kırılma olan malzemelere izin veren yol izleyicilerdeki örnekleme konusu aslında biraz daha karmaşıktır.

Önce biraz arka planla başlayalım. Yol izleyicinizde BSDF'lere - sadece BRDF'lere - izin verirseniz, sadece pozitif yarımküre yerine tüm küreye entegre olmanız gerekir. Monte Carlo örnekleri çeşitli stratejilerle üretilebilir: doğrudan aydınlatma için BSDF ve ışık örneklemesi kullanabilirsiniz, dolaylı aydınlatma için genellikle tek anlamlı strateji BSDF örneklemesidir. Örnekleme stratejilerinin kendileri genellikle hangi yarım kürenin örnekleneceğine dair karar içerir (örneğin, yansıma veya kırılma hesaplanıp hesaplanmadığı).

En basit versiyonda, ışık örneklemesi genellikle yansıma veya kırılma konusunda fazla dikkat etmez. Işık özelliklerine göre ışık kaynaklarını veya ortam haritasını (varsa) örnekler. Yalnızca malzemenin sıfır olmayan bir katkısı olduğu yarımküreyi seçerek çevre haritalarının örneklenmesini geliştirebilirsiniz, ancak malzeme özelliklerinin geri kalanı genellikle yok sayılır. Fresnel malzeme için ideal ve pürüzsüz bir malzeme için ışık örneklemesinin çalışmadığını unutmayın.

BSDF örneklemesi için durum çok daha ilginçtir. Açıkladığınız durum, sadece iki katkıda bulunan yönün olduğu ideal bir Fresnel yüzeyi ile ilgilidir (Fresnel BSDF aslında iki delta fonksiyonunun toplamı olduğundan). İntegrali kolayca iki parçaya bölebilirsiniz - biri yansıma diğeri kırılma için. Bahsettiğiniz gibi, bir yol izleyicide her iki yönde gitmek istemediğimizden, bir tane seçmek zorundayız. Bu, sadece birini seçerek sayıların toplamını tahmin etmek istediğimiz anlamına gelir. Bu, ayrık Monte Carlo tahmini ile yapılabilir: katkı maddelerinden birini rastgele seçin ve toplama olasılığına bölün. İdeal bir durumda, örnekleme olasılığının eklerle orantılı olmasını istersiniz, ancak değerlerini bilmediğimizden (bunları bilseydik toplamı tahmin etmemiz gerekmez), sadece bazı faktörleri ihmal ederek tahmin ediyoruz. Bu durumda, gelen ışık miktarını görmezden gelir ve tahminlerimiz olarak yalnızca Fresnel yansıtma / geçirgenliğini kullanırız.

Pürüzsüz Fresnel yüzeyi durumunda BSDF örnekleme rutini, bu nedenle, Fresnel yansıma ile orantılı olasılıkla rastgele yönlerden birini seçmek ve bir noktada, yönü seçme olasılığına göre sonucu bölmektir. Tahminci şöyle görünecektir:

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

ωi=(ϕi,θi)Lben(ωben)F(θben)P(ωben)F(θben)

Mikrofacet teorisine dayananlar gibi daha karmaşık BSDF modellerinde, örnekleme biraz daha karmaşıktır, ancak tüm integrali sonlu integrallerin sınırlı bir toplamına bölme ve daha sonra ayrı Monte Carlo kullanma fikri de genellikle uygulanabilir.


1
Bu ilginç ama bir noktadan kafam karıştı. "Yönü seçme olasılığına göre sonucu o yöne bölmenin" ne anlama geldiğini açıklayabilir misiniz? İkili bir seçim değil, sürekli bir dağıtımdan seçilen bir yön ise, olasılık sıfır olmaz mı?
trichoplax

1
@trichoplax: Evet, ama bu paragrafta, örnekleme tekniğini sadece (dielektrik) Fresnel BSDF - iki Dirac delta fonksiyonunun toplamı olan ideal pürüzsüz yüzey için örnekleme tekniğini tarif ediyordum. Bu durumda, belirli bir olasılıkla yönlerden birini seçersiniz. Delta olmayan (sonlu) BSDF olması durumunda, olasılık yoğunluk fonksiyonuna göre yönler oluşturursunuz. Ne yazık ki, delta ve delta olmayan durumlar ayrı ayrı ele alınmalıdır, bu da kodu biraz dağınık hale getirir. Mikrofaset BSDF'lerin örneklenmesi hakkında daha fazla ayrıntı, örneğin Walter vd. ark. [2007] bildiri.
ivokabel

2
@RichieSams: Walter ve diğ. ark. [2007] temel olarak hala dielektrik pürüzlü yüzeyler için son teknoloji ürünüdür, ancak iyi çalışması için Heitz ve D'Eon tarafından 2014 tarihli "Önem Örneklemesi Mikrofacet Tabanlı BSDF'ler tarafından yayınlanan iyi bir örneklemeye ihtiyacınız vardır. msgstr "Görünür Normallerin Dağılımı". Ayrıca, mikro yüzeyler arasındaki yansımaları ihmal eden, daha yüksek pürüzlülük değerleri için gözle görülür şekilde karanlık hale getiren tek saçılma modelidir. Daha fazla ayrıntı için "Tek saçılma mikrofacet BSDF modellerinde enerji kaybının telafisi" sorumu inceleyin.
ivokabel

5
Sadece önerilen soru olarak olasılık = fresnel () seçerseniz, olasılıkla bölündüğünüzde, normalde çarpılacak Fresnel faktörünü iptal edeceğinizi belirtmek istedim. Yani (ayrık, iki Dirac durumunda ) herhangi bir Fresnel faktörü içermeyen ışın katkısı ile sonuçlanır. Standart önem-örnekleme teorisi, ama bunu kafa karıştırıcı bir konu olarak göstereceğimi düşündüm.
Nathan Reed

2
@Nathan, bildirimini cevaba dahil ettim.
ivokabel
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.