Bagaimana cara menerapkan bayangan bayangan 2D di antara lapisan?

10

Bagaimana saya bisa menerapkan bayangan 2d yang dilemparkan oleh objek di lapisan yang berbeda?

BUKAN seperti pencahayaan dinamis dalam tutorial terkenal dari Catalin Zima :

masukkan deskripsi gambar di sini

Tapi seperti bayangan pipa di video ini :

masukkan deskripsi gambar di sini

Dan seperti bayangan platform dan karakter dalam video ini :

masukkan deskripsi gambar di sini

Saya ingin menggunakan jenis pencahayaan yang sama dalam sebuah adegan dengan banyak lapisan dan banyak lampu dengan warna berbeda.

Saya bisa membayangkan melakukan ini dengan menggambar salinan hitam dari lapisan di atas lapisan di belakang lapisan itu, dan menyesuaikannya sesuai dengan lubang di lapisan di mana bayangan dilemparkan. Tapi saya harap ada pendekatan berbasis pixel-shader yang lebih murah untuk ini.

Berry
sumber

Jawaban:

1

Ini bisa dilakukan dengan masking. Ada banyak cara untuk melakukannya.

Salah satu caranya adalah dengan memiliki cara untuk membuat versi bayangan elemen foreground. Gambarlah latar belakang. Kemudian gambarkan elemen latar depan, kurangi sedikit tergantung pada bagaimana Anda ingin pencahayaan bergerak, sedemikian rupa sehingga Anda hanya menghasilkan warna hitam. Kemudian gambar latar depan secara normal.

Cara lain adalah dengan membuat foreground menjadi buffer, sedikit lebih banyak dari yang sebenarnya Anda lihat. Kemudian lakukan beberapa pass "to black" dan mungkin pass blur. Sekarang render output dari set pass ini dan kemudian bagian yang terlihat dari buffer foreground.

Untuk mendukung beberapa lampu pada sudut yang berbeda, Anda bisa melakukan langkah sebelumnya beberapa kali, atau menumpuknya semua dalam satu buffer. Matematika akan bervariasi berdasarkan pada apa yang Anda coba capai, tetapi tebakan pertama pada apa yang terjadi dalam video pertama adalah bahwa mereka hanya mengambil posisi cahaya terhadap posisi kamera (tengah area yang terlihat) dan lalu gunakan vektor itu (diskalakan) untuk menentukan cara mengimbangi bayangan. Sesuatu seperti:

draw background
for each light intersecting viewing bounds:
  offset = light.position - camera.position
  offset *= SCALE FACTOR (0.25 maybe)
  draw shadow foreground at offset
draw foreground

Lampu yang "lebih dekat" ke tempat kejadian akan memiliki faktor skala yang lebih kecil. Jika Anda ingin banyak kedalaman, ada beberapa matematika untuk bekerja di sana, hal-hal geometris sederhana.

Sean Middleditch
sumber
Ya, inilah tepatnya yang saya pikirkan. Tidak tahu istilah yang benar untuk itu adalah masking. Tapi saya berharap mungkin akan ada algoritma yang lebih mirip dengan bagaimana volume bayangan bekerja di ruang 3D ..
Berry
Ketika Anda melemparkan bayangan di atas permukaan dengan lubang di dalamnya, Anda harus melemparkan bayangan penduduk di atas lapisan di belakangnya. Juga, bekerja dengan transparansi akan menjadi sedikit rumit. Saya sudah memikirkan semua solusi untuk masalah ini! Tapi saya pikir itu akan menjadi terlalu mahal untuk diterapkan secara real time, terutama ketika berhadapan dengan banyak lapisan (20) dan banyak lampu (50). Itu sebabnya saya berharap untuk pendekatan yang berbeda.
Berry