Saya sedang menulis mesin isometrik 2d kecil di C ++ dan saya mencoba menerapkan pengecoran bayangan waktu nyata. Saya mengikuti pendekatan sederhana yang dijelaskan pada halaman ini dan inilah hasilnya (cahaya terletak pada posisi yang sama dari kubus kuning):
Hasilnya sangat bagus tetapi ada bayangan yang hilang di dinding dan di atas kubus. Berikut adalah contoh tampilannya (saya telah menggambar bayangan yang diharapkan berwarna hijau):
Semua kubus yang ditarik hanya terbuat dari 3 paha depan 2D yang terletak pada posisi XY dan dengan kedalaman Z (z = x + y). Saya menggunakan OpenGL dengan matriks ortografis (glOrtho). Bayangan digambar menggunakan buffer stensil.
Saya mencari sumber daya atau solusi yang akan membantu saya menyelesaikan implementasi pengecoran bayangan ini.
Terima kasih banyak!
Jawaban:
Untuk atap dan dinding, Anda dapat mencoba untuk menentukan persimpangan antara segmen dinding Anda dan daerah bayangan yang dihasilkan. Anda perlu dua rendering bayangan Anda. Yang pertama akan melakukan apa yang Anda lakukan hari ini (dalam penyimpanan memori). Lulus kedua akan menghitung persimpangan atap dan dinding. Tahap terakhir adalah rendering nyata. DeadMG salah, Anda bisa melakukannya.
Catatan: untuk atap Anda harus memotong area bayangan dan area atap.
sumber
Pada dasarnya, apa yang Anda cari tidak dapat dilakukan. Anda ingin mengambil banyak objek 2D dan minta mereka membuat bayangan seolah-olah mereka adalah objek 3D. Jika Anda ingin memiliki bayangan 3D penuh, Anda harus memiliki objek 3D.
sumber
Solusi yang dijelaskan tidak full 3d karena ia tidak memerlukan solusi 3d penuh. Akan terlihat seperti tetapi tidak. Pembuatan pengecoran bayangan harus dianggap sebagai persimpangan antara volume. Apa yang dia butuhkan tidak terlalu rumit. Ingat (jika Anda punya gaun) malapetaka dan malapetaka seperti mesin rendering. Semua pemrosesan dilakukan pada dua dimensi.
sumber
Mengingat Anda ingin game ini berukuran kecil, bagaimana dengan hanya mengatakan bahwa implementasi bayangan saat ini cukup baik?
Saya akui bahwa saya belum melihat ini dalam aksi, yaitu, saya belum melihat seberapa mengganggu atau tidak mengganggu ketidaksempurnaan bayangan akan ketika game ini dijalankan secara langsung dengan objek dinamis dan sumber cahaya dinamis tetapi menilai dari gambar Anda, saya ' Saya sangat tergoda untuk mengatakan "ini cukup baik, sekarang fokuslah untuk menyelesaikan permainan". Jika implementasi saat ini kecil dan mengeksekusi cepat dan memperbaiki apa yang Anda anggap masalah akan mengubah kode besar dan lambat, saya pikir Anda lebih baik tidak khawatir tentang bayangan itu.
Saya tahu, saya tahu, menyarankan "jangan mencoba untuk memecahkan masalah" sebagai solusi untuk masalah mungkin merupakan praktik yang buruk. Namun, saya jujur ingin mengatakan bahwa itu benar-benar baik karena jika Anda ingin jejak kecil untuk kode Anda.
sumber