Mengapa beberapa game menunjukkan lampu bersinar melalui dinding?

28

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.

Marcus
sumber
21
Sebuah gambar bernilai 1000 kata.
Evorlor
8
Saya harus bermain untuk menguji, tetapi apakah itu benar-benar cahaya yang bocor, atau mungkin itu adalah efek partikel yang bercahaya? Terutama contoh Anda tentang ledakan rudal, saya bisa membayangkan efek partikel "api" tambahan yang sangat mungkin mengabaikan benturan. Lentera juga bisa melakukan hal yang sama untuk membuat lingkaran cahaya yang terlihat, saya kira ...
AC
@Evorlor menambahkan satu contoh.
Marcus

Jawaban:

43

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.

DMGregory
sumber
3
Kerutan lainnya adalah bahwa meskipun sepele untuk mencari tahu apakah sumber cahaya ada di depan atau di belakang permukaan, mencegah permukaan bercahaya ketika menyala dari belakang sering menghasilkan hasil yang terlihat aneh.
supercat
Dan ini terutama benar dengan efek partikel (yang kemungkinan ledakannya, setidaknya sebagian), karena partikel harus sangat murah untuk ditangani agar sangat berguna.
Luaan
2
Cahaya dan partikel adalah dua hal yang berbeda. Sebuah partikel juga dapat "bocor" melalui rintangan, tetapi karena alasan yang sangat berbeda. Kadang-kadang sistem partikel juga akan menyertakan cahaya untuk membantu menjual efek (pikirkan api unggun atau segerombolan kunang-kunang), tetapi cahaya di dalam efek partikel masih hanya cahaya, biasanya bukan varian khusus.
DMGregory
2
Pendekatan alternatif untuk peta bayangan adalah volume bayangan , yang memperbaiki masalah aliasing, tetapi lebih mahal: membutuhkan geometri tambahan yang harus diberikan (poligon baru per tepi siluet dari setiap objek untuk setiap sumber cahaya), serta lintasan render tambahan. Saya berharap pendekatan pemetaan cukup baik untuk sebagian besar situasi.
DarthFennec
22

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.

TomTsagk
sumber
6
Jadi, apakah ray melacak lebih banyak hal untuk film CGI daripada game real-time?
Akumulasi
21
@Akumulasi Itu benar. Satu frame film bisa memakan waktu berjam-jam untuk dibuat, sementara gim hanya memiliki milidetik.
NobodyNada
16
Yang mengatakan, permainan semakin mengeksplorasi menggunakan raytracing atau raymarching bersama dengan teknik rasterisasi, membiarkan rasterizer melakukan apa yang baik dan sinar melakukan apa yang mereka lakukan dengan baik. Ini bukan raytracing penuh dari setiap piksel, tetapi Anda masih bisa mendapatkan beberapa efek hebat dengan cara itu.
DMGregory
2
@DMGregory Memang, game seperti Duke Nukem 3D sudah menggunakan varian raytracing yang sangat disederhanakan - meskipun itu tidak digunakan untuk pencahayaan yang dinamis, dan itu pasti tidak melacak setiap piksel pada layar (biasanya, itu dilakukan untuk setiap kolom piksel), dan refleksi dan transparansi masih merupakan kasus khusus daripada standar. Render perangkat lunak 3D selalu dimainkan dengan pendekatan yang serupa, itu adalah perangkat keras 3D yang menutup jalan itu (sampai sekarang).
Luaan
@Acccumulation Raytracing datang pada level yang berbeda, jadi sementara game bisa di atas garis hardware menembakkan sinar primer, mereka masih tidak melakukan bouncing sekunder yang cukup atau beberapa bouncing per pixel. Jadi, bahkan jika Anda akan raytrace Anda masih memiliki tradeoff kinerja seperti ini. Jadi kemampuan melacak lampu utama masih tidak berarti Anda mampu membuat semua lampu sekunder.
joojaa