Shader yang "memotong" lubang melalui semua geometri

10

Bagaimana saya bisa membuat shader yang "memotong" semua geometri, hanya menampilkan latar belakang penyatuan di Unity? Sebuah contoh:

masukkan deskripsi gambar di sini

Itu adalah prisma di ruangan besar berbentuk kotak putih. Permukaan prisma hanya merender skybox tempat kejadian (langit berbintang). Saya menggunakan beberapa kamera, yang sangat tidak efisien ... Pasti ada cara hanya dengan shader.

Bagaimana saya bisa melakukan ini?

CalebHC
sumber

Jawaban:

14

Ok, akhirnya menemukan jawabannya!

masukkan deskripsi gambar di sini

Anda melihat bagaimana jala bola "memotong" melalui silinder dan pesawat sampai ke skybox. Ini membutuhkan waktu lebih lama dari yang saya harapkan untuk menyelesaikannya, tetapi berkat halaman wiki ( http://wiki.unity3d.com/index.php/DepthMask ), saya dapat memilah semuanya.

Sebelum menggunakan pengaturan shader di halaman wiki saya menggunakan tiga kamera yang berbeda dengan bendera clearing / depth yang berbeda untuk mencapai hasil yang sama. Itu bekerja tetapi benar-benar tersedak pada Ouya. Solusi di atas hanya membutuhkan satu kamera dan berjalan sangat cepat.

Jadi saya mengatur adegan seperti itu ...

  1. menambahkan skybox realistis (nasa)

  2. menambahkan beberapa bentuk

  3. menambahkan skrip SetRenderQueue ke bidang, bola dan silinder

  4. atur urutan antrian pada bola ke 2999 (objek lainnya berada pada 3000)

  5. kemudian menambahkan shader DepthMask ke bola

Itu dia. Ada pertanyaan, beri tahu saya!

CalebHC
sumber
2
D'oh, saya benar-benar terlalu memikirkan masalah dalam posting saya di atas (saya berpikir tentang lubang lubang datar di dinding / lantai, sungguh). Solusi tertaut menunjukkan objek lubang 3D, dan solusi yang ditampilkan, untuk kasus ini, sangat sederhana - yang perlu Anda lakukan hanyalah menulis 'lubang' ke dalam buffer-z tanpa menulis warna apa pun, dan pastikan lubangnya adalah ditarik lebih awal.
bluescrn
@bluescrn Jangan khawatir! Saya menghargai pos terperinci. :)
CalebHC
2

Beberapa opsi untuk mendapatkan efek yang Anda inginkan - tetapi itu memang menimbulkan biaya:

  • Tulis lubang ke buffer stensil atau saluran alpha tujuan, lalu gambar skybox terakhir, menggunakan uji stensil yang sesuai atau campuran alfa, dan tanpa uji-z?

atau

  • Render skybox ke tekstur di awal bingkai, dan proyeksikan itu ke 'lubang geometri'

Saya menduga bahwa harus ada cara untuk melakukan ini dengan menggunakan / menyalahgunakan z-buffer juga - tetapi Anda mungkin ingin z-test 'lubang poligon' menggunakan Z asli mereka, kemudian menulis Z berbeda. Anda mungkin bisa menggunakan beberapa lintasan dan buffer stensil - menggambar lubang 3 kali dengan renderstate yang diatur seperti ini mungkin berhasil:

  • Lulus 1: Tidak ada uji-z, Bersihkan stensil di bawah lubang lubang
  • Lulus 2: Uji-z normal, nilai stensil kenaikan (di mana uji kedalaman dilewati)
  • Lulus 3: Hapus Z di mana stensil> 0

Anda masih harus menggambar dalam urutan tertentu - pertama lingkungan, lalu lubang, dan akhirnya skybox bertahan.

bluescrn
sumber