Dapatkah seseorang menjelaskan pencahayaan radiositas kepada saya?

8

Saya sudah memiliki dasar-dasar oklusi sekitar. Saya memiliki raycaster dan mampu memotret sinar tentang belahan bumi secara seragam. Sepertinya itu adalah dasar dari apa yang dibutuhkan untuk radiositas tetapi saya tidak tahu harus ke mana dari sana. Apakah saya menemukan berapa banyak cahaya yang berasal dari masing-masing wajah? (Saya membuat game saya dari kubus seperti minecraft) Setelah itu apa yang harus saya lakukan?

Xavier
sumber
3
Mengapa diberi tag "minecraft"?
Valmond

Jawaban:

9

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.

Chumby Gumball
sumber
Halo Chewy. Apakah ini berhasil? Saya cukup yakin bahwa itu harus mempertimbangkan hukum kosinus lambert. Tapi mungkin saya tidak mendapatkan sesuatu.
Notabene
1
Ini bisa seakurat mungkin secara fisik seperti yang Anda inginkan. Sudut antara tambalan dapat diperhitungkan dengan nilai pengubah pertama, bersama dengan sejumlah fenomena lainnya. Ini hanya garis besar umum dari apa yang terjadi.
Chewy Gumball
Baik. Sangat bagus. Ini adalah pertama kalinya saya mendengar tentang radiositas dalam mode ray casting. Tapi itu masuk akal. Terima kasih untuk itu
Notabene