Aydınlatma modellerindeki doğrusal zayıflama bileşeninin fiziksel bir karşılığı var mı?


18

Gibi OpenGL (ve diğer sistemler) 'de noktalı ışıklar için mesafe zayıflatma faktörü bir şey 1/(c+kd+sd^2)burada, dışık mesafedir ve c, kve ssabittir.

sd^2Gerçekte beklenen, fiziksel olarak doğru bilinen "ters kare yasası" zayıflamasını modelleyen bileşeni anlıyorum .

Sanırım sabit c, genellikle bir, çok küçük değerlerle d(ve belki de sıfıra böl)?

kdModelde doğrusal bileşenin rolü nedir (varsayılan kolarak OpenGL'de sıfırdır). Diğer değerleri ne zaman kullanırsınız k? Bunun "doğrusal zayıflama" bileşeni olarak adlandırıldığını biliyorum, ancak aydınlatma modelinde hangi davranışı simüle ediyor? Fark ettiğim herhangi bir fiziksel ışık modelinde görünmüyor.

[DÜZENLE]

David Gouveia tarafından, doğrusal faktörün sahneyi geliştiricinin / sanatçının amaçladığı şeye 'daha yakın' görünmesine yardımcı olmak veya ışığın düşme hızını daha iyi kontrol etmek için kullanılabileceği belirtildi. Bu durumda sorum şu: "Doğrusal zayıflama faktörünün bir fizik karşılığı var mı yoksa sadece sahnedeki ışığın kalitesini kontrol etmeye yardımcı olmak için bir şekerleme faktörü olarak mı kullanılıyor?"


Doğrusal zayıflamanın bir sahneyi daha iyi veya daha gerçekçi hale getirdiğini söylemedim . Söylediklerim tam o olabilir için iyi görünmesini senin amaçlar. Raytracer'ım çok küçük bir sahneyi aydınlattı ve her iki modeli karşılaştırırken lineer daha iyi görünüyordu. Daha iyi göründüğünü söylemek için fiziksel bir nedene ihtiyacım yok - sadece elde etmek istediğim etkiye daha yakın görünüyordu. Tersine, ters kare yasası gerçekçi görünmüyordu, sadece çok hızlı bir şekilde düştü ve sahne aydınlatmasına ihtiyacım olandan daha az katkıda bulundu.
David Gouveia

Üzgünüm David, cevabını yanlış tanıtmak istememiştim. Yukarıdaki düzenlememi değiştirdim.
Ken

1
Tüm aydınlatmanın hack, saf ve basit olduğunu hatırlamak her zaman iyidir =)
Patrick Hughes

Yanıtlar:


21

Nokta benzeri kaynaklardan gelen ışık, mesafenin karesiyle düşer. Bu fiziksel gerçeklik.

Doğrusal zayıflamanın genellikle daha üstün olduğu belirtilir. Ancak bu sadece bir doğrusal olmayan renk uzayında . Yani, eğer uygun gama düzeltmesi etkin değilse. Nedeni oldukça basit.

Gama düzeltmesi yapmadan doğrusal olmayan bir ekrana doğrusal RGB değerleri yazıyorsanız, doğrusal değerleriniz monitörün yerleşik gama rampası tarafından yönetilir. Bu etkili , sahneyi gerçekte amaçladığınıza göre koyulaştırır .

2,2'lik bir gama olduğu varsayıldığında, monitörünüz tüm renkleri etkili bir şekilde 2,2'nin gücüne yükseltir.

Bu doğrusal zayıflamadır: 1/kd . Bu monitörün gama rampası lineer zayıflama uygulanan: 1/(kd)^2.2. Bu düzgün bir ters kare ilişkisine oldukça yakın.

Ama asıl ters kare: 1/sd^2olur: 1/((s^2)(d^4.4)). Bu, ışık zayıflamasının düşmesini sağlar beklenenden çok daha keskin bir şekilde .

Genel olarak, uygun gama düzeltmesi kullanıyorsanız (sRGB çerçeve arabelleğine oluşturma gibi), doğrusal zayıflatma kullanmamalısınız. Doğru görünmeyecek.Hiç . Ve eğer gama düzeltmesi kullanmıyorsanız ... neyin var?)

Her durumda, gerçekliği taklit etmeye çalışıyorsanız, ters kare (ve gama doğru) istiyorsunuz. Eğer değilseniz, sahneniz için ne gerekiyorsa yapabilirsiniz.


4
+1 Bir süredir gamma doğru oluşturmayı biliyorum. Bir süredir kuadratik ve doğrusal zayıflamayı biliyorum. Ve bu, ikisi arasındaki bağlantıyı ilk fark ettiğim andır. :-)
David Gouveia

9

Esneklik .

Çünkü ışıklarınızın doğrusal olarak düşmesini isteyebilirsiniz. Size bu kontrolü vermek için orada. Gerçekten fiziksel olarak doğru olması gerekmez (ve tüm phong gölgeleme aydınlatma denklemleri de kesinlikle fiziksel olarak doğru değildir).

Bazen kuadratik model kaynağın yakınında çok hızlı ışık verir ve yakındaki yüzeylerde "beyaz kamaşma" bırakır. Doğrusal ve sabit katsayılar sağlayarak, sonuçları istediğiniz gibi ayarlama esnekliğine sahip olursunuz

Örneğin, bir raytracer uyguladığımda, ters kare yasasının nokta ışıklarımı çok hızlı bir şekilde düşürdüğünü öğrendim. Sıkıştırılmış doğrusal bir modele geçtim (her ışığın minimum ve maksimum yarıçapa sahip olduğu, aralarında doğrusal enterpolasyon ile) ve daha iyi görünüyordu.

Düzenleme: Sadece bunu açıklayan güzel bir kaynak bulundu .


6

Tamam, bir tahminde bulunacağım.

Ön gözlem

Gibi OpenGL (ve diğer sistemler) 'de noktalı ışıklar için mesafe zayıflatma faktörü bir şey 1/(c+kd+sd^2)burada, dışık mesafedir ve c, kve ssabittir.

sd^2Gerçekte beklenen, fiziksel olarak doğru bilinen "ters kare yasası" zayıflamasını modelleyen bileşeni anlıyorum .

Eğrisi c+kd+sd^2bir parabol, ve böylece eğrisi sd^2; fark göründüğü kadar önemli değildir: sonsuzlukta benzer şekilde davranırlar, sadece küçük oldukları için farklıdırlar. Ne kanlama geliyorsa, sadece ışığa yakın olduğunda anlamlıdır.

Ön sadeleştirme

Bu bir zayıflama faktörü olduğundan , ifadede s == 1her bir sabiti ayarlayabilir veya bölebilir sve ışık kaynağınızın gücünü bölebilirsiniz s. Formülde çok fazla bir parametre var.

Sonuç olarak:

1/(c/s+(k/s)d+d^2)

Değişken değişimi

… Kesinlikle şuna eşittir:

1/(A + D^2)

ile A == c/s - k^2/(4s^2)ve daha da önemlisi,D == d + k/2s .

Bu 1/(A+D^2)gerçekten her zamanki gibi görünüyor 1/(c+d^2), değil mi?

Sonuç

kFaktör avans veya sadece bir yarıçap başlar, böylece ışık zayıflamasının geciktirir-k/2s (evet, o da "olumsuz" yarıçapına sahip ikinci kez dışarı ışık izin verir hayali küresel aynanın içindeki hayali nokta ışık düşünebildiğim) . Görünüşe göre matematik tekrar kazanıyor!

Edit: Bir saniye için küresel bir ışık eşdeğer olduğunu düşündüm, ama değil. En önemlisi yumuşak gölgeler oluşturmaz.

Kullanışlılığı?

Benim tahminim, bu parametrenin bir sanatçı tarafından bir nesneyi aydınlatma açısından nesneye daha yakın (ya da daha uzakta) görünmesini sağlamak için kullanabilmesidir, ancak onu hareket ettirmeden. Nokta ışıkları sert gölgeler oluşturduğundan, ışığın belirli bir konumda kalması bir gereklilik olabilir.


3

Doğrusal zayıflama katsayısı, bir ortama giren ışığın fiziksel karşılığıdır. Zayıflama olmadan, ışık mükemmel bir şekilde yolculuk ediyor gibi görünüyor. "Gerçekçi" sahneler oluştururken, havanın uzaklıktaki ışığın yoğunluğunu azaltmasını istersiniz ve bu zayıflama doğrusaldır.


Bunun doğru olabileceğini düşünmüyorum. Bir ortam aracılığıyla ışık hareket zayıflatılmış olur 1/dolarak R, koordinat ve yine ile 1/d^2de thetave phiküresel koordinatlar. Bu nedenle tarif ettiğiniz şey 1/d^3ışık yoğunluğunun zayıflamasıdır.
sam hocevar

3

Lineer azalma faktörü size aydınlatma için lineer zayıflama kullanmak isteyebilirsiniz durumlar için orada, ama en önemli şey - eğer yok olması (bu konuda, ya da diğer Zayıflamalar faktörlerden herhangi biri) kullanmak.

Bu, aydınlatmanızı kendi kişisel zevkinize göre ayarlamanıza olanak tanır. Bu nedenle, 0 ile istemediğiniz herhangi bir zayıflama faktörünü ve 0 olmayanlar için yapmak istediğiniz zayıflama faktörünü ayarlayın ve bitti.

Doğrusal zayıflamayı kullanmak isteyebileceğiniz belirli bir örnek, daha matematiksel olarak doğru ters kare çok hızlı bir düşüş sağlarsa olacaktır. Doğrusal kullanarak, yeterince veya daha az iyi görünebilen bir sonuç elde edebilirsiniz (ve sahnede daha az ışıkla); 0 sabit, 1 doğrusal ve 0 üstel kullanırsınız.

Hem OpenGL hem de D3D'deki nokta spritelarının (ve OpenGL'deki nokta parametrelerinin) aynı zayıflama formülünü kullandığını not etmek (ancak kuşkusuz bu tartışma ile ilgili değildir) ilginçtir.

Ayrıca OpenGL / D3D aydınlatmasının kesinlikle fiziksel olarak doğru bir şekilde tasarlanmadığını belirtmek gerekir; asla kabul edilebilir bir yaklaşımdan başka bir şey olarak tasarlanmamıştır ve çalışma şekliyle ilgili herhangi bir şeyi sorgularken akılda tutulmalıdır.

Tabii ki, günümüzde büyük olasılıkla bir gölgelendirici kullanacaksınız, bu nedenle eski ışık formülü esas olarak yalnızca akademik / tarihi ilgi alanına giriyor - istediğiniz ışık formülünü yazabilirsiniz.


1
  • c ışık kaynağı için sabit zayıflama değeridir.
  • ldoğrusal zayıflamadır. Bu yüzden uzaklıkla ışık kaynağına çarpılır.
  • s ikinci dereceden zayıflamadır, bu yüzden mesafenin karesiyle çarpılır.

Bu bağlantıda biraz daha bilgi var .


Teşekkürler, ama sorum şu: Doğrusal zayıflatma bileşeninin ışığı modellemedeki rolü nedir. Soruyorum çünkü farkında olduğum hiçbir fizik ışık modelinde görünmüyor. Sağladığınız bağlantı, doğrusal zayıflatma bileşeninin ne için olduğunu AÇIKLAMAZ. Sadece diyor ki; Başka bir açıklama yapmadan "bu doğrusal zayıflamadır".
Ken

Tamam, sorunuzu yanlış yorumladım. Kuadratik, küresel bir ışık kaynağının davranışını modellerken, sonsuz zayıflama, tek boyutlu bir ışık kaynağında (flüoresan bir tüp düşünün) daha iyi gözlemlenir. Şimdiye kadar, fiziksel ışık modeli ile bilgisayar grafiklerinde kullanılan yazışma arasındaki açıklamanın sadece bir yeri buldum: imdoingitwrong.wordpress.com/2011/01/31/light-attenuation
r2d2rigo

1

Z'nin saygın Eric Lengyel'in sözleriyle ,

Perspektif doğru rasterleştirme 1 / z doğrusal enterpolasyonu gerektirdiğinden - z'nin kendisinin lineer enterpolasyonu doğru sonuçları vermez. Donanım, her tepe noktasında 1 / z hesaplamalı ve bir üçgen içinde enterpolasyon yapmalıdır, bu nedenle z'yi kurtarmak için her pikselde pahalı bir bölüm yapmak yerine bu değeri derinlik arabelleğine yazmak uygundur.

Yakın düzleme daha fazla z hassasiyeti getirmeniz sadece bir yan etkidir ve 1 / z enterpolasyonunun arkasındaki motivasyonla ilgisi yoktur.

Derinlik tamponu mesafeleri saklar. Işık zayıflama için mesafeyi kullanır. Derinlik tamponu ve bunu gerektiren aydınlatma uygulamaları arasındaki ilişki olabilir, ancak bu sadece aydınlatma algoritması sanırım ekran alanında koşuyorsa geçerli olurdu. Önceden hesaplanmış (veya donanım hesaplanmış) bir tersi saklamanın, ona ihtiyaç duyan kare başına her bir op için bölünmemiş değer üzerinde bölünme yapmaktan daha iyi olduğunu ve çok fazla sayıda op olma eğiliminde olduğunu unutmayın.

Bu sadece bir tahmin.


Orada bir şey olabilirsiniz. Aydınlatmanın hesaplandığı alanla bir ilgisi olabilir. Ancak derinlik tamponunun bir parçası olduğunu düşünmüyorum, çünkü gözden (veya ön düzlemden) nesneye 'sahte mesafeyi' saklıyor, ışıktan nesneye olan uzaklığı değil. Aydınlatmada kullanılan ışık mesafesidir.
Ken

@downvoter - yorum yapmak ister misiniz, yoksa sadece trolling mi? (Jonathan'a alıntı yapmak için)
Mühendis

Aşağı oylama da zayıflama, normalize edilmemiş boşlukta hesaplanır -> perspektif / z'nin bununla hiçbir ilgisi yoktur
Oliver Zendel

1

Tıpkı bir ek olarak: Küresel bir ışık kaynağına yaklaşmak için openGL modelini kullanırken, üç katsayı da mantıklıdır ve geçerlidir ("taşmaları önlemek" veya "sanatsal özgürlüğe" sahip olmak için değil):

Yarıçapı r olan bir küre için:

1 / (D / r + 1) ^ 2

bu şu anlama gelir

c = 1 k = 2 / r s = (1 / r ^ 2)

(bkz. http://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/ ).

Bu yaklaşım, hiç uzanmadan sonsuz küçük nokta ışıklarını kullanmaktan daha iyidir!


1 / (d / r + 1) ^ 2 formülü nasıl gelir? Orijinal makale sadece "Bir dizi testten elde edilen sonuçlara baktıktan sonra, belirginleşti" diyor ve bu da fiziksel modelleme hakkında soru sorma konusunda yeterince ikna edici değil.
user1914692

0

Formül hakkında farklı bir görüşüm / cevabım var.

Örneğin, bir spot ışığı gördüğümüzde, aslında ışığın dağıldığını görürüz. Yani 1 / d ^ 2 formülü sadece bu pikselin yayma ışığı içindir. Ancak bu pikselin kameramızdaki parlaklığı, ışık saçılma teorisini kullanacak daha karmaşık bir formüle sahip olacak. Makaleye bakın

"Tek Saçılma ile Katılan Ortamlarda Gölgeler ve Crepuscular Işınlar için Epipolar Örnekleme"

Thomas Engelhardt, Carsten Dachsbacher Ancak maalesef ışık saçılımı için son basit bir formülleri yok. Sanırım belki son GPU taklit etkisi doğrusal ve karesel formüle benzer olurdu.

Bence iddia:

"Gerçeği taklit etmeye çalışıyorsanız, ters kare (ve gama doğru) istiyorsunuz" geçerli değil.

Aslında formülü gama olmadan doğrusal ve kuadratik faktörlerle birlikte kullanıyorum, parlayan etkileri çok iyi taklit edebilirim. Doğrusal olamaz.

Kısa bir özet olarak formül, ışık saçılımının fiziksel karşılığıdır.

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.