Dalam beberapa permainan, saya melihat lampu bersinar melalui dinding, bahkan jika saya mengatur kualitas video pada level tinggi.
Beberapa contoh gim yang baru-baru ini saya mainkan adalah Borderlands 2 (ledakan misil) dan Call of Cthulhu (lentera; gim ini bahkan menggunakan Unreal Engine 4).
Apakah ini bug atau ada alasan kinerja?
Contoh Borderlands 2: https://youtu.be/9bV83qA6_mU?t=419 (beberapa kali, tetapi dengan cepat)
Pertanyaan bonus: dalam kasus terakhir, apakah ada cara ray tracing dapat digunakan secara murah untuk menyelesaikan masalah? Saya kira mahal RT pasti memecahkan masalah, tapi saya ingin tahu apakah itu juga dapat digunakan dalam bentuk "murah" untuk menyelesaikan masalah khusus ini.
lighting
shadows
raytracing
Marcus
sumber
sumber
Jawaban:
Memperluas jawaban yang benar dari TomTsagk, saya pikir mungkin membantu untuk menjelaskan lebih banyak tentang mengapa game bekerja seperti ini.
Cahaya dalam gim tidak benar-benar "bergerak" dari sumber, ke permukaan, ke kamera, terhalang di sepanjang jalan.
Untuk mengetahui seberapa terang untuk menggambar setiap piksel permukaan berdasarkan pada cahaya yang diberikan, kami menggunakan (atau memperkirakan) rumus matematika yang menggunakan arah permukaan yang menghadap dan arah dari titik ini di permukaan ke sumber cahaya. Itu saja, hanya dari arah mana ia bersinar - kita biasanya tidak melempar sinar untuk memeriksa apakah cahaya benar-benar mencapai piksel ini, karena melakukan itu untuk setiap piksel pada layar dan memeriksa sinar terhadap semua geometri terperinci dalam adegan adalah biasanya masih terlalu mahal untuk game realtime.
Jadi, secara default, tidak ada lampu game yang memberi bayangan. Arah ke cahaya tetap sama bahkan jika ada shadowcaster di jalan, sehingga matematika memberi kita nilai kecerahan yang sama.
Jika kita ingin mensimulasikan bayangan, kita harus melakukannya secara terpisah. Salah satu cara yang umum adalah dengan apa yang disebut Peta Shadow. Dalam versi ini, sebelum kita menaungi adegan kita, pertama-tama kita membuat adegan dari perspektif masing-masing cahaya, seolah-olah cahaya itu adalah kamera, menyimpan kedalaman setiap piksel yang dilihatnya ke dalam tekstur di luar layar.
Kemudian, ketika kita menaungi pemandangan, kita dapat membandingkan jarak matematis piksel ini dari sumber cahaya vs kedalaman yang kami rekam pada piksel yang sesuai dalam peta bayangan. Jika kedalaman bayangan peta lebih kecil, maka itu berarti ada permukaan lain antara sini dan cahaya, dan kami menggambar pixel ini sebagai bayangan.
Ada banyak sekali teknik keren untuk membuat bayangan berbasis peta ini terlihat lebih bagus, dengan lebih sedikit artefak / aliasing, tetapi saya akan mengabaikannya untuk saat ini. Cukuplah untuk mengatakan, mereka umumnya juga tidak gratis.
Karena ini memerlukan rendering (hingga) seluruh adegan lagi dari perspektif masing-masing cahaya - hingga enam kali jika itu adalah titik cahaya yang bersinar di semua arah {utara, selatan, timur, barat, atas, bawah}, dan kita perlu kembali -Render peta bayangan kapan saja sesuatu bergerak, ini bisa menjadi sangat mahal.
Jadi game akan sering memfokuskan anggaran rendering mereka pada lampu paling penting di tempat kejadian - seperti cahaya matahari terarah - untuk memastikan mereka memiliki bayangan yang cantik. Lampu kecil, berumur pendek, kecil seperti kilatan ledakan sering dimaafkan jika sedikit bocor melewati oklusi. Seringkali ini lebih cocok untuk pemain daripada hambatan di framerate karena kenaikan mendadak dalam biaya rendering dari semua rendering dan perhitungan peta shadow ekstra. Terutama jika itu adalah adegan aksi yang sibuk di mana fluiditas lebih penting daripada kesempurnaan piksel.
sumber
Singkat cerita, ini terjadi karena alasan kinerja.
Ketika ada cahaya di layar, secara default itu menyinari semua objek (terhalang atau tidak), jadi game perlu membuat perhitungan ekstra untuk melihat objek mana yang terpengaruh oleh apa.
Ini lebih mudah untuk diselesaikan pada objek statis dengan menggunakan pencahayaan statis dan panggang, tetapi ini tidak sama pada lampu dinamis, seperti ledakan seperti yang Anda catat.
Untuk pertanyaan bonus Anda, ray tracing dan murahan tidak cocok pada kalimat yang sama. Satu-satunya alasan ray tracing belum menjadi arus utama sampai sekarang adalah kinerja. Dengan asumsi semua lampu menggunakan ray tracing, maka masalah ini akan "diselesaikan", tetapi dengan mengorbankan kinerja.
sumber