Unity: Terapkan Efek Gambar pada satu layer saja


8

Silakan pertimbangkan adegan sederhana ini.

masukkan deskripsi gambar di sini

Ini terdiri dari 3 objek permainan yang berbeda. 1 gambar latar belakang + 1 gambar karakter statis + 1 bagian kecil (dengan hewan peliharaan) yang diubah saat runtime untuk melakukan animasi.

masukkan deskripsi gambar di sini

Latar Belakang dibuat menggunakan kamera khusus. Karakter (statis + anim) dirender menggunakan kamera khusus lainnya. Kedua kamera disetel ke Kedalaman Hanya dengan masker pemusnahan yang berbeda (setiap kamera hanya membuat bagiannya). Perhatikan bahwa kamera yang bertanggung jawab atas karakter memiliki kedalaman yang lebih besar daripada yang bertanggung jawab atas latar belakang (yaitu Karakter diberikan setelah latar belakang).

Saya perlu menerapkan efek gambar hanya pada kamera karakter, tetapi saya tidak dapat menemukan cara agar efek ini tidak mempengaruhi latar belakang.

Contoh di sini dengan efek Vortex pada kamera karakter.

masukkan deskripsi gambar di sini

Bagaimana Anda melakukan trik seperti itu?

Jawaban:


8

Masalahnya adalah bahwa efek gambar ambil layar saat ini setelah render.

Karena kamera Anda merender langsung ke backbuffer (kedalamannya hanya jelas), efek gambar berlaku untuk semuanya.

Solusi bisa berupa:

  • Siapkan Kamera terlebih dahulu yang jernih ke warna transparan, dengan pengaturan RenderTarget (Anda dapat membuatnya dengan skrip sehingga ukurannya sama dengan layar Anda) dan pasca proses yang diinginkan.
  • Atur Camera kedua yang membuat latar belakang Anda, yang jelas menjadi warna latar belakang / skybox
  • Menyiapkan Kamera ketiga, yang tidak menghasilkan apa-apa (penutup mask diatur ke Tidak Ada), menghapus apa-apa dan memiliki skrip AlphaBlit.cs terlampir. AlphaBlit membutuhkan dua info: bahan yang menggunakan AlphaBlit.shader dan rendertarget untuk digabungkan (Anda harus menetapkannya dengan skrip jika Anda membuatnya dengan skrip pada langkah 1)
  • Siapkan Kamera keempat yang merender karakter maju Anda.

HATI-HATI: ini adalah algoritma pelukis. Berarti semua yang diberikan oleh kamera ketiga berada di atas apa yang sudah ada di sana, dan kamera keempat akan membuatnya di atas itu.

Saya tidak yakin ada cara untuk melakukan yang lebih baik, karena akan perlu juga mendistorsi buffer kedalaman, yang tidak mungkin ... (bukan tanpa secara langsung render dengan efek vortex yang lebih sulit) ...

Tentu saja cara yang lebih dioptimalkan untuk melakukannya adalah dengan tidak menerapkan postprocess pada kamera 1, tetapi hanya membuatnya rendering dalam rendertarget dan memodifikasi AlphaBlit.shader untuk melakukan efek pusaran saat menyatukan RenderTarget itu. Tapi itu lebih kompleks.


Terima kasih atas jawaban anda. Saya memiliki beberapa masalah dengan "Render kamera dengan script yang cukup dilakukan di OnRenderImage a Blit dari RenderTarget itu ke target render tujuan (yaitu backbuffer di sini)". .. karena walaupun warna hitam transparan semuanya hitam sekali blit.
lvictorino

jawaban yang diedit dengan lebih presisi
Sirithang

Alur kerja solusi dasar baik-baik saja, tetapi saya menghadapi masalah yang tidak terduga dengan alpha di sini. Sebenarnya saya ingin mengaburkan tingkat latar depan. Solusi ini berfungsi, tetapi entah bagaimana terlihat kabel. puu.sh/C6sSB/ca5d5162b0.jpg Jika saya mengubah warna bendera yang jelas ke Magenta dengan 0 transparansi, ia memiliki garis magenta yang aneh di samping (harus transparan). puu.sh/C6sSB/ca5d5162b0.jpg . Ini membuat seluruh solusi tidak berfungsi untuk saya. Saya tidak begitu yakin, mengapa ini terjadi. Mengalihkan bendera yang jelas tidak membantu.
AvrDragon
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.