Ada banyak cara untuk melakukan ini. Ini akan membutuhkan penggunaan shader dan saya berasumsi bahwa Anda sudah melakukan pencahayaan per-pixel. Berikut ini adalah beberapa saran, namun menemukan teknik yang tepat untuk Anda mungkin memerlukan lebih banyak penelitian.
Cepat dan kotor
Anda dapat menentukan kotak pembatas yang menentukan area interior. Jika cahaya berada di luar kotak, tetapi geometri (yang tidak dalam bayangan) ada di dalam kotak, maka cahaya pasti terpengaruh dengan melewati jendela (ini juga berlaku jika geometri berada di luar kotak dan cahaya di dalam). Satu-satunya masalah di sini adalah bagaimana meneruskan informasi kotak ke shader dan bagaimana menyatakan efeknya pada cahaya.
Pilihan lain adalah menentukan windows sebagai objek yang diletakkan di pesawat. Tes pertama untuk melihat apakah geometri dan cahaya berada di sisi yang berlawanan dari pesawat dan kemudian jika cara di antara mereka memotong pesawat pada titik di dalam batas-batas jendela. Ini akan lebih akurat daripada metode pertama dan akan lebih mudah untuk memiliki jendela ke interior yang sama dengan warna kaca yang berbeda.
Terus semakin detail dengan representasi geometris windows dan Anda akan mendapatkan hasil yang lebih akurat, tetapi perhitungannya juga akan semakin berat.
Teknik-teknik ini akan bekerja cukup baik untuk penembak koridor, tetapi tidak begitu baik untuk dunia yang dinamis atau terbuka karena banyak penyesuaian mungkin diperlukan untuk membuatnya terlihat benar tanpa terlalu banyak artefak. Juga, teknik-teknik ini dapat dengan cepat menjadi sedikit intens, sehingga pindah ke pipa peneduh yang ditangguhkan akan disarankan.
Peta Bayangan
Pilihan lain adalah melakukan sesuatu yang mirip dengan pemetaan bayangan.
Dalam pemetaan bayangan Anda menghasilkan beberapa gambar bitmap dari dunia yang dipengaruhi oleh cahaya. Setiap piksel, meski masih berwarna, sebenarnya adalah jarak potongan terdekat dari geometri non-transparan (Anda menggunakan empat byte untuk 1 float, bukan 4 warna). Jika Anda menghitung jarak dari cahaya ke sepotong geometri dan itu lebih jauh dari nilai yang sesuai di peta bayangan maka potongan geometri Anda dalam bayangan (Anda biasanya menggunakan sinar antara geometri dan cahaya untuk mengindeks peta).
Jika Anda menerapkan ide ini untuk masalah Anda, maka apa yang akan Anda lakukan adalah menyimpan peta jarak dari cahaya bagian terdekat dari geometri transparan, dan kemudian juga membuat peta kedua warna cahaya setelah melewati geometri itu ( cukup warna geometri jika cahayanya putih).
Jika potongan geometri Anda lebih jauh dari jarak di peta ini, maka gunakan warna peta, jika tidak maka gunakan warna cahaya asli.
Fungsi untuk menghitung warna untuk setiap piksel dalam peta seharusnya kira-kira; lightColor - terbalikWindowColor. Jadi untuk cahaya putih murni dan jendela merah murni yang tidak menyerap spektrum merah yang kita dapatkan; (255.255.255) - (0,255.255) = (255,0,0). Jadi warna cahaya di sisi lain adalah merah murni. Untuk objek transparan yang lebih kompleks, seperti jendela kaca patri, Anda mungkin ingin memiliki tekstur untuk mendapatkan warna material.
Jika Anda mencari sesuatu yang serupa maka periksa Peta Shadow Reflektif .
Teknik ini menawarkan banyak kesetiaan dan mungkin yang terbaik jika Anda ingin menggunakan geometri transparan yang kompleks seperti jendela kaca patri.
Mencoba Solusi Umum
Baru-baru ini menjadi populer untuk menyandikan informasi pencahayaan dalam representasi voxel (mereka tidak hanya untuk geometri). Mesin crytek terbaru menggunakan jenis strategi ini untuk penerangan tingkat lanjut ( volume perambatan cahaya ).
Inilah ide umumnya:
- Buat peta kubus dengan spasi merata yang mencakup adegan Anda (pertimbangkan untuk menggunakan kurva z-order ).
- Temukan cara menyimpan informasi pencahayaan untuk setiap voxel (representasi harmonik bola berguna di sini).
- Temukan voxel yang mengandung cahaya dan mewakili cahaya itu di voxel.
- Menyebarkan cahaya keluar melalui voxels yang berdekatan (seperti air minecraft seperti)
- Hitung bagaimana geometri di setiap voxel akan memengaruhi cahaya yang melewatinya (menyerap, memantulkan, mengirimkan)
- ulangi sampai cahaya memudar
Ada banyak cara untuk membangun informasi voxel ini, tetapi daftar di atas memberikan gambaran umum. Sebagai contoh; Anda bisa mulai dengan membuat peta bayangan / volume dan kemudian memproyeksikan informasi itu ke dalam peta voxel sehingga Anda dapat dengan cepat membuat peta pencahayaan langsung. Kemudian Anda mulai propagasi dari voxel di sepanjang tepi area yang terpengaruh. Tetap di tambang bahwa, dalam hal ini, Anda akan ingin mengabaikan apakah geometri transparan atau tidak saat membuat peta bayangan / volume.
Pada langkah terakhir penyaji yang ditangguhkan, saat menghitung penerangan titik geometri, Anda cukup menggunakan posisi geometri untuk mengindeks peta voxel Anda untuk mengetahui seperti apa pencahayaan yang terjadi pada titik ruang tersebut. Kemudian Anda dapat membangun peta layar sisi cpu pencahayaan insiden, atau mungkin melakukan ini dengan cuda.