Dalam pertanyaan sebelumnya , disarankan bahwa bidang jarak yang ditandatangani dapat dihitung sebelumnya, dimuat saat runtime dan kemudian digunakan dari sana.
Untuk alasan yang akan saya jelaskan di akhir pertanyaan ini (untuk orang-orang yang tertarik), saya perlu membuat bidang jarak secara real time.
Ada beberapa makalah di luar sana untuk metode yang berbeda yang seharusnya dapat bertahan dalam lingkungan waktu nyata, seperti metode untuk transformasi jarak Chamfer dan transformasi berbasis diagram-pendekatan Voronoi (seperti yang disarankan dalam presentasi ini oleh pria pengembang Pixeljunk Shooter dev ), tetapi Saya (dan dengan demikian dapat diasumsikan banyak orang lain) memiliki waktu yang sangat sulit untuk menggunakannya, karena biasanya panjang, sebagian besar penuh dengan matematika dan tidak terlalu algoritmik dalam penjelasannya.
Algoritma apa yang akan Anda sarankan untuk membuat bidang jarak secara real-time (lebih baik pada GPU) terutama mengingat kualitas yang dihasilkan dari bidang jarak?
Karena saya sedang mencari penjelasan / tutorial yang sebenarnya dan bukan tautan ke kertas atau slide lain, pertanyaan ini akan menerima hadiah setelah memenuhi syarat untuk satu :-).
Inilah mengapa saya perlu melakukannya secara real time:
Jika Anda harus melakukan precompute SDFs ini untuk lingkungan 2D yang besar (pikirkan peta seperti Terraria yang besar), ini berarti Anda menerima overhead yang agak besar di ruang penyimpanan (dan waktu pembuatan peta) demi menerapkan lebih banyak algoritma rumit yang cukup cepat untuk pembuatan SDF waktu nyata.
Misalnya, peta yang relatif kecil dengan 1000 * 256 (lebar * tinggi) dengan ukuran ubin 10 * 10 piksel dan dengan demikian total dimensi 10.000 * 2560 piksel akan dikenakan biaya sekitar 2 megabita ukuran, jika Anda memilih yang relatif kecil Resolusi SDF 128x128, dengan asumsi bahwa Anda hanya menyimpan nilai jarak dari 0 hingga 255.
Jelas, ini bisa dengan cepat menjadi terlalu banyak dan merupakan overhead yang tidak ingin saya miliki.
Ada sesuatu yang lain:
SDF dapat digunakan untuk banyak hal (seperti deteksi tabrakan), dan beberapa aplikasi yang berguna bahkan belum ditemukan. Saya pikir banyak orang akan mencari hal-hal ini di masa depan, dan jika kita mendapatkan jawaban yang komprehensif di sini, saya pikir kita akan membantu banyak orang.
sumber
Jawaban:
Catalin Zima menjelaskan cara mencapai bayangan 2D dinamis di artikelnya - dan dia memang menggunakan bidang jarak yang telah ditandatangani (dari apa yang bisa saya katakan itu hanyalah nama mewah untuk buffer bayangan dalam konteks ini). Metodenya memang membutuhkan GPU, dan implementasinya apa adanya adalah bukan yang terbaik (turun di bawah 60Hz pada sekitar 20 lampu pada mesin saya, saya punya sekitar 500 lampu); yang diharapkan karena dia lebih menyukai kejelasan kode daripada kecepatan.
Pelaksanaan
Persis seperti yang diterapkan olehnya:
Implementasi terakhir saya adalah (setiap langkah menjadi shader tunggal):
Ini cukup cerdik: ini pada dasarnya merupakan terjemahan langsung dari bagaimana bayangan ditangani dalam 3D menjadi 2D.
Perangkap
Perangkap utama adalah bahwa beberapa objek tidak boleh dibayangi: dalam contoh saya, saya sedang menulis klon Liero (cacing waktu nyata) dan karenanya tidak ingin, misalnya, cacing para pemain dibayangi (setidaknya satu di layar masing-masing pemain). Yang saya lakukan untuk benda-benda 'istimewa' ini adalah menggambarnya kembali sebagai langkah terakhir. Ironisnya adalah bahwa sebagian besar objek tidak dibayangi (cacing, latar depan lanskap) sehingga ada masalah penarikan di sini.
sumber