Saya tidak tahu apa yang Anda pemrograman, tapi ini adalah bagaimana saya menanganinya di XNA:
- Pada panggilan undian, sebuah
List<Light>
objek dibuat / dihapus.
- Selama loop menggambar ubin, setiap ubin diperiksa untuk melihat apakah ada Lampu yang terkait dengannya. Jika ya,
Light
objek akan ditambahkan ke List<Light>
.
- Ubinnya digambar sendiri
RenderTarget2D
.
- Setelah loop ubin, daftar
Light
s iterasi dan digambar sendiri RenderTarget2D
menggunakan tekstur yang saya buat yang terlihat seperti ini:
(Catatan: Saya menggunakan nilai R, G dan B di sini, tetapi Anda mungkin harus menggunakan saluran alpha di tekstur aktual.)
- Menggunakan custom shader, saya membuat permukaan ubin ke layar dan lulus di permukaan pencahayaan sebagai parameter yang diambil sampel untuk nilai "kegelapan" di setiap piksel.
Sekarang, ada beberapa hal yang perlu diperhatikan:
Mengenai Poin 4:
Saya sebenarnya memiliki dua custom shader, satu untuk menggambar lampu ke target render pencahayaan (langkah 4) dan yang lain untuk menggambar target render ubin ke layar menggunakan target render pencahayaan (langkah 5).
Shader yang digunakan pada titik 4 memungkinkan saya untuk menambahkan (apa yang saya sebut) nilai "luminositas". Nilai ini adalah float
yang dikalikan dengan setiap piksel dalam tekstur sebelum ditambahkan ke target render sehingga saya pada dasarnya dapat membuat lampu lebih terang atau lebih gelap.
Pada titik ini, saya juga memperhitungkan nilai "skala" cahaya yang berarti saya dapat memiliki lampu besar atau kecil hanya dengan menggunakan satu tekstur.
Mengenai Poin 5:
Pikirkan target render pencahayaan karena pada dasarnya memiliki nilai untuk setiap piksel dari 0 (hitam) hingga 1 (putih). Shader pada dasarnya mengalikan nilai tersebut dengan nilai RGB untuk piksel dalam target render ubin untuk membuat gambar akhir yang digambar.
Saya juga memiliki beberapa kode di sini di mana saya memberikan (ke shader) nilai untuk digunakan sebagai warna overlay siang / malam. Ini juga dikalikan dengan nilai RGB dan termasuk dalam perhitungan target render pencahayaan.
Sekarang, ini tidak akan memungkinkan Anda untuk melakukan hal-hal seperti memblokir cahaya dari berkeliling benda dan yang lainnya, tetapi setidaknya untuk tujuan saya, itu sederhana dan bekerja dengan baik.
Saya telah menulis posting blog yang lebih rinci di sini dan di sini yang dapat membantu Anda. Saya tidak punya waktu sekarang, tetapi jika Anda mau, saya bisa masuk ke detail lebih lanjut di gamedev.
Oh, dan ini dia lihat di editor peta saya: