Pada salah satu slide dari "DirectX 11 Rendering di Battlefield 3" PowerPoint saya perhatikan kode berikut:
struct Light {
float3 pos; float sqrRadius;
float3 color; float invSqrRadius;
}
Saya tidak mengerti mengapa mereka menyimpan jari-jari kuadrat dan bahkan kuadrat terbalik (yang saya percaya hanya jari-jari 1-kuadrat) daripada hanya menyimpan jari-jari? Bagaimana mereka menggunakan data ini dalam perhitungan mereka? Apalagi bagaimana dengan lampu kerucut dan garis? Struct ini harus hanya untuk lampu titik, saya tidak bisa melihatnya bekerja untuk jenis lain - tidak ada data yang cukup. Masih saya ingin tahu bagaimana mereka menggunakan kotak itu dan invSquare.
PEMBARUAN: Ok akhirnya saya mengerti.
Berikut ini adalah persamaan redaman cahaya klasik, yang mudah ditemukan di internet:
float3 lightVector = lightPosition - surfacePosition;
float attenuation = saturate(1 - length(lightVector)/lightRadius);
Ini relatif mahal karena length(lightVector)
sebenarnya melakukan ini:
length(lightVector) = sqrt(dot(lightVector, lightVector);
Selain itu operasi divisi (/lightRadius)
juga cukup mahal.
Alih-alih menghitung redaman cahaya dengan cara ini, Anda dapat menghitungnya dengan cara berikut, yang akan jauh lebih cepat:
attenuation = saturate(1 - dot(lightVector, lightVector)*invRadiusSqr);
di mana invRadiusSqr dapat dipra-komputasi pada level CPU dan dilewatkan sebagai konstanta shader.
Selain itu, Anda mendapatkan redaman cahaya kuadrat sebagai hasilnya (bukan linier dalam kasus sebelumnya), yang bahkan lebih baik, karena cahaya IRL telah menunjukkan memiliki kuadratik falloff.
Terima kasih semuanya atas bantuan Anda!