"DirectX 11 Battlefield 3 Rendering" PowerPoint slaytlardan birinde Aşağıdaki kod fark ettim:
struct Light {
float3 pos; float sqrRadius;
float3 color; float invSqrRadius;
}
Neden sadece yarıçapı depolamak yerine kare yarıçapı ve hatta ters kare (sadece 1 kare yarıçap olduğuna inanıyorum) depolayacaklarını anlamıyorum? Bu verileri hesaplamalarında nasıl kullanıyorlar? Dahası, koni ve hat ışıkları ne olacak? Bu yapı sadece nokta ışıkları için olmalı, diğer türler için çalıştığını göremiyorum - yeterli veri yok. Yine de o kareyi ve invSquare'i nasıl kullandıklarını bilmek isterim.
GÜNCELLEME: Tamam sonunda anladım.
İşte ağda kolayca bulunan klasik ışık zayıflama denklemi:
float3 lightVector = lightPosition - surfacePosition;
float attenuation = saturate(1 - length(lightVector)/lightRadius);
length(lightVector)
Aslında bunu yapmak nispeten maliyetlidir :
length(lightVector) = sqrt(dot(lightVector, lightVector);
ayrıca bölüm operasyonu (/lightRadius)
da oldukça maliyetlidir.
Işık zayıflamasını bu şekilde hesaplamak yerine, aşağıdaki şekilde hesaplayabilirsiniz; bu çok daha hızlı olacaktır:
attenuation = saturate(1 - dot(lightVector, lightVector)*invRadiusSqr);
burada invRadiusSqr, CPU düzeyinde önceden hesaplanabilir ve gölgelendirici sabiti olarak geçirilebilir.
Dahası, sonuç olarak ikinci dereceden bir ışık zayıflaması elde edersiniz (eski durumda doğrusal yerine), bu daha da iyidir, çünkü IRL ışığının kuadratik falloff'a sahip olduğu gösterilmiştir.
Yardımlarınız için herkese teşekkürler!