Memang, itulah yang Anda butuhkan untuk radiositas. Ada dua formulasi berbeda (tetapi sama). Yang pertama adalah untuk "memancarkan" atau menembak cahaya dari setiap patch (dalam kasus Anda mungkin wajah), dan yang lainnya adalah untuk "mengumpulkan" atau menerima cahaya ke setiap patch. Jika Anda melakukannya berulang kali cukup, Anda mendapatkan radiositas.
Langkah pertama adalah mencari tahu dari mana cahaya berasal karena dalam metode apa pun harus ada sumber cahaya. Jika Anda akan melakukan metode pengumpulan, saya harus memperingatkan Anda bahwa itu tidak menangani lampu titik dengan sangat baik. Anda harus menambal tambalan dengan cahaya (menghitungnya secara terpisah) atau Anda mendapatkan hasil yang aneh. Dalam metode memancarkan Anda memancarkan dari titik lampu seperti biasa tetapi mengabaikannya sebagai penerima dari patch lainnya.
Anda dapat berhenti setelah sejumlah bouncing (atau iterasi), tetapi semakin banyak Anda melakukannya, semakin baik solusinya. Anda memiliki waktu yang mudah untuk membuat tambalan karena Anda dapat menganggap setiap sisi kubus Anda sebagai tambalan. Jika Anda menginginkan sesuatu yang lebih rinci, Anda dapat membagi wajah-wajah itu lebih jauh lagi.
Dalam contoh memancar, ini bisa digunakan sebagai dasar untuk loop Anda:
while(!done) {
foreach Patch a {
a.shootRays(n);
foreach ray r {
Patch b = r.firstIntersectingPatch();
float modifier = 1 / ((distance(a,b)^2)
b.incidentLight += (a.exidentLight / n) * modifier;
}
}
foreach Patch a {
float modifier = a.absorption;
a.exidentLight = (a.incidentLight * modifier) + a.emission;
a.incidentLight = 0;
}
done = goodEnough() ? true : false;
}
Untuk metode kumpulkan, Anda akan memiliki loop pertama yang sedikit berbeda:
foreach Patch a {
a.shootRays(n);
foreach ray r {
Patch b = r.firstIntersectingPatch();
float modifier = 1 / ((distance(a,b)^2)
a.incidentLight += b.exidentLight * modifier;
}
a.incidentLight /= n;
}
Pengubah pertama digunakan untuk setiap modifikasi patch dari cahaya yang masuk. Penggunaan paling umum adalah falloff dari jarak seperti yang saya lakukan di atas. Pengubah kedua adalah untuk modifikasi global dari cahaya yang masuk seperti penyerapan material. Variabel a.emission akan menjadi 0 untuk sebagian besar tambalan.
Hanya sumber cahaya (atau dipengaruhi langsung oleh sumber cahaya titik jika Anda menggunakan metode kumpulkan seperti disebutkan di atas) yang harus memiliki nilai emisi 0.
Fungsi goodEnough () bisa jadi banyak hal. Bisa jadi hanya menghitung jumlah iterasi, atau bisa juga melihat jumlah total cahaya di tempat kejadian, atau bisa juga beberapa tes lain yang Anda rencanakan. Bagian ini benar-benar terserah Anda dan apa yang menurut Anda terlihat cukup baik tetapi masih selesai dalam jumlah waktu yang wajar.
Semakin banyak sinar yang Anda potret, semakin akurat solusi Anda tetapi semakin lambat prosesnya. Hal yang sama berlaku untuk jumlah tambalan dan jumlah iterasi melalui loop. Bagaimana Anda menyimpan nilai lampu akhir terserah Anda. Itu bisa dalam tekstur, atau disimpan sebagai nilai dalam kubus Anda, tetapi saya tidak berpikir ini akan layak untuk dilakukan secara real-time dengan jumlah tambalan yang layak.