Bu, Beer Yasasını uygulamanın doğru yolu mu?


11

Beer yasasını uyguladığımda (bir cisimden uzaklaştıkça renk emilimi), bir sebepten dolayı asla çok iyi görünmüyor.

Nesnenin arkasındaki renk olduğunda, ayarlanan rengi şu şekilde hesaplarım:

const vec3 c_absorb = vec3(0.2,1.8,1.8);
vec3 absorb = exp(-c_absorb * (distanceInObject));
behindColor *= absorb;

Bu bana böyle bir şey verecektir (biraz kırılma uygulandığını unutmayın): resim açıklamasını buraya girin

Ve burada kırılma yok: resim açıklamasını buraya girin

Bunun burada bir gölgelendirici oyuncak olarak uygulandığını unutmayın .

Bu, Beer yasasının yaptığı şeyin açıklamasını yerine getirir, ancak bu gibi çekimlerle karşılaştırıldığında çok iyi görünmüyor: resim açıklamasını buraya girin

Aynasal vurgular bir yana, farkı anlamaya çalışıyorum. Geometrimin gerçekten çok iyi göstermesi çok basit olabilir mi? Yoksa yanlış mı uyguluyorum?


2
Ancak bir küpü daha karmaşık bir ağ ile karşılaştırıyorsunuz. Neden aynı senaryoyu çoğaltmıyorsunuz? Susan modelini elde etmek kolaydır.
Bart

Bir shadertoy uygulamasında o kadar kolay değil! (:
Alan Wolfe

2
Küp bana doğru görünüyor: Kenarlara yaklaştıkça daha şeffaf olun. Suzanne tam şişmiş yapabilirseniz, bir küre en azından diğer resimdeki görünümün daha iyi bir yaklaşımını vermelidir.
yuriks

1
Kırılmayı zayıflamadan ayıramıyorum. Küpü IOR = 1.0 ile işleyebilir misiniz?
imallett

1
@AlanWolfe IOR = 1 renderiniz tam beklediğim gibi görünüyor ve shadertoy impl'ünü yağmaladım ve iyi görünüyor.
imallett

Yanıtlar:


12

Görüntünüz kesinlikle doğru görünmüyor ve gözünüzün içinden geçerken ışık ışınlarının iç yolunu doğru bir şekilde hesaplayamadığınız anlaşılıyor. Görünüşe göre, görüş ışının küpün içine ilk girdiği nokta ile ilk önce iç duvara çarptığı nokta arasındaki mesafeyi hesapladığınızı ve bunu emme mesafeniz olarak kullandığınızı söyleyebilirim. Bu aslında ışığın bir duvara ilk kez vurduğunda camdan her zaman çıkacağını varsayar ki bu da zayıf bir varsayımdır.

Gerçekte, ışık havadan cam içine girdiğinde, genellikle camdan hemen çıkmaz. Çünkü ışık cam / hava arayüzüne çarptığında, toplam iç yansıma (TIR) olarak bilinen bir fenomen meydana gelebilir. TIR, ışık, daha yüksek kırılma indisine (IOR) sahip bir ortamdan daha düşük bir IOR'ye sahip bir ortamdan geçtiğinde ortaya çıkar; bu, bir cam nesnenin iç duvarına isabet eden ışık durumunda tam olarak gerçekleşir. Wikipedia'dan gelen bu resim, ortaya çıktığında neye benzediğinin iyi bir görsel gösterisidir:

toplam iç yansıma

Temel olarak, bunun anlamı, ışık sığ bir açıyla vurursa, ışığın ortamın içinden tamamen yansıyacağıdır. Bunu hesaba katmak için Fresnel denklemlerini değerlendirmeniz gerekirışık ışınınız her cam / hava arayüzüne (AKA ağınızın iç yüzeyi) çarptığında. Fresnel denklemleri, yansıyan ışığın kırılan ışığın miktarına oranını söyleyecek, TIR durumunda ise 1 olacaktır. Daha sonra, uygun yansıyan ve kırılan ışık yönlerini hesaplayabilir ve ışığın yolunu ortamın içinden veya dışından izlemeye devam edebilirsiniz. Düzgün bir saçılma katsayısına sahip basit bir dışbükey ağ kabul ederseniz, Birader yasası için kullanılacak mesafe, ortamdan çıkmadan önce tüm iç yol uzunluklarının toplamı olacaktır. İşte bir küp, saçılma katsayılarınız ve IOR 1.526 (soda kireç camı) ile, hem iç hem de dış yansımaları ve kırılmaları açıklayan kendi yol izleyicim kullanılarak oluşturulan şuna benziyor:

yol izli cam küp

Sonuçta iç yansımalar ve kırılmalar, camı cam gibi gösteren şeyin önemli bir parçasıdır. Basit yaklaşımlar, zaten bildiğiniz gibi, gerçekten kesmiyor. Birden çok kafes ve / veya dışbükey olmayan kafes eklerseniz daha da kötüleşir, çünkü sadece iç yansımaları hesaba katmakla kalmaz, aynı zamanda ortamı terk eden ve farklı bir noktaya giren ışınları da hesaba katmanız gerekir.


1
Here is what a cube looks like (...) using my own path tracer. Herhangi bir şans eseri açık kaynaklı mı oldunuz?
çalışması devam ediyor

2
Hayır henüz değil. Cam işleme ile ilgili bir blog yazısı ile birlikte bu özel varyantı bitirmeyi ve serbest bırakmayı planlıyordum, ancak bir süredir işimde kaldı.
MJP
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.