Tüm geometri boyunca deliği kesen gölgelendirici


11

Tüm geometriyi "kesen" ve yalnızca Unity'deki temizleme arka planını oluşturan bir gölgelendirici nasıl oluşturabilirim? Bir örnek:

resim açıklamasını buraya girin

Bu kutu şeklindeki kocaman beyaz odada bir prizma. Prizmanın yüzeyi sadece sahnenin skybox'ını (yıldızlı bir gökyüzü) oluşturuyor. Oldukça verimsiz olan birden fazla kamera kullandım ... Sadece gölgelendiricilerin bir yolu olmalı.

Bunu nasıl yapabilirim?

Yanıtlar:


15

Tamam, sonunda anladım!

resim açıklamasını buraya girin

Küre örgünün silindirden ve düzlemden nasıl gökyüzü kutusuna kadar "kesildiğini" görürsünüz. Bu beni anlamaya beklenenden daha uzun sürdü ama bir wiki sayfası ( http://wiki.unity3d.com/index.php/DepthMask ) sayesinde hepsini sıraladım.

Wiki sayfasında gölgelendirici kurulumunu kullanmadan önce, aynı sonucu elde etmek için farklı temizleme / derinlik bayraklarına sahip üç farklı kamera kullanıyordum. İşe yaradı ama tamamen Ouya'yı boğdu. Yukarıdaki çözüm yalnızca bir kamera gerektirir ve çok fasta çalışır.

Bu yüzden sahneyi böyle kurdum…

  1. gerçekçi bir skybox (nasa) ekledi

  2. bazı şekiller ekledi

  3. düzleme, küre ve silindire SetRenderQueue komut dosyasını ekledi

  4. küredeki kuyruk sırasını 2999 olarak ayarlayın (diğer nesneler 3000'de)

  5. daha sonra küreye DepthMask gölgelendirici ekledi

Bu kadar. Herhangi bir sorunuz varsa bana bildirin!


2
D'oh, yukarıdaki yazımda problemi tamamen fazla düşünmüştüm (duvarlarda / katlarda düz delikli kafesler düşünüyordum). Bağlantılı çözüm bir 3D delik nesnesini gösterir ve bu durumda gösterilen çözüm çok basittir - aslında yapmanız gereken tek şey, herhangi bir renk yazmadan z-buffer'a 'delik' yazmak ve deliğin erken çizilmiş.
bluescrn

@bluescrn Endişelenme! Ayrıntılı gönderiyi takdir ediyorum. :)
CalebHC

2

İstediğiniz efekti elde etmek için birkaç seçenek - ancak bir maliyet geliyor:

  • Delikleri şablon tamponuna veya hedef alfa kanalına yazın, ardından uygun bir şablon testi veya alfa karışımı kullanarak ve z testi olmadan skybox'ı en son çizin?

veya

  • Skybox'ı çerçevenin başlangıcında bir dokuya dönüştürün ve bunu 'delik geometrisine' yansıtın

Z-buffer'ı da kullanarak / kötüye kullanarak bunu yapmanın bir yolu olması gerektiğinden şüpheleniyorum - ama muhtemelen gerçek Z'lerini kullanarak 'delik poligonlarını' test etmek, sonra farklı bir Z yazmak istersiniz. çoklu geçişler ve şablon arabelleği - deliği bu şekilde işleyecek şekilde oluşturulmuş olarak 3 kez çizmek:

  • Pass 1: Z testi yok, delik polys altında açık şablon
  • 2. Geçiş: Normal z testi, Artış şablon değeri (derinlik testinin geçtiği yer)
  • Pass 3: Şablonun 0 olduğu Z'yi temizle

Yine de belirli bir sırayla çizmeniz gerekir - önce çevre, daha sonra delikler ve son olarak skybox en son.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.