Moduł cieniujący, który „wycina” otwór przez całą geometrię

11

Jak mogę stworzyć moduł cieniujący, który „tnie” całą geometrię, renderując jedynie tło usuwania w Unity? Przykład:

wprowadź opis zdjęcia tutaj

To pryzmat w ogromnym białym pokoju w kształcie pudełka. Powierzchnia pryzmatu po prostu renderuje skybox sceny (gwiaździste niebo). Użyłem wielu kamer, co jest dość nieefektywne ... Musi być jakiś sposób tylko z shaderem.

W jaki sposób mogę to zrobić?

CalebHC
źródło

Odpowiedzi:

15

Ok, w końcu to rozgryzłem!

wprowadź opis zdjęcia tutaj

Widzisz, jak siatka sfery „przecina” się przez cylinder i leci aż do skyboksa. Zajęło mi to dłużej niż się spodziewałem, ale dzięki stronie wiki ( http://wiki.unity3d.com/index.php/DepthMask ) wszystko załatwiłem.

Przed użyciem ustawień modułu cieniującego na stronie wiki korzystałem z trzech różnych kamer z różnymi flagami czyszczenia / głębokości, aby osiągnąć ten sam wynik. Działało, ale całkowicie zakrztusiło się Ouyą. Powyższe rozwiązanie wymaga tylko jednej kamery i działa bardzo szybko.

Więc ustawiłem scenę tak…

  1. dodano realistyczny skybox (nasa)

  2. dodano niektóre kształty

  3. dodano skrypt SetRenderQueue do płaszczyzny, kuli i walca

  4. ustaw kolejność na sferze na 2999 (pozostałe obiekty są na 3000)

  5. następnie dodał moduł cieniujący DepthMask do kuli

Otóż ​​to. Wszelkie pytania daj mi znać!

CalebHC
źródło
2
Nie, całkowicie przesadziłem z problemem w powyższym poście (naprawdę myślałem o płaskich oczkach na ścianach / podłogach, naprawdę). Połączone rozwiązanie pokazuje trójwymiarowy obiekt dziury, a pokazane rozwiązanie w tym przypadku jest bardzo proste - wystarczy, że zapiszesz „dziurę” w buforze Z bez zapisywania jakiegokolwiek koloru i upewnij się, że otwór jest narysowany wcześnie.
bluescrn
@bluescrn Bez obaw! Doceniam szczegółowy post. :)
CalebHC
2

Kilka opcji, aby uzyskać pożądany efekt - ale są one kosztowne:

  • Zapisz dziury w buforze szablonu lub docelowym kanale alfa, a następnie narysuj skybox jako ostatni, używając odpowiedniego testu szablonu lub mieszanki alfa i bez testu Z?

lub

  • Renderuj skybox do tekstury na początku ramki i rzutuj go na „geometrię otworu”

Podejrzewam, że musi istnieć sposób na to, używając / nadużywając również bufora Z - ale prawdopodobnie chcesz przetestować „wielokąty dziurowe” przy użyciu ich prawdziwej Z, a następnie napisać inną Z. Prawdopodobnie możesz użyć wielokrotne przejścia i bufor wzornika - rysowanie otworu 3 razy przy ustawionym stanie renderowania w ten sposób może działać:

  • Zaliczenie 1: Brak testu Z, Wyczyść szablon pod polami otworów
  • Zaliczenie 2: Normalny test Z, Przyrost wartości szablonu (w przypadku pozytywnego wyniku testu głębokości)
  • Pass 3: Wyczyść Z, gdzie szablon> 0

Nadal będziesz musiał rysować w określonej kolejności - najpierw środowisko, potem dziury, a na końcu skybox.

bluescrn
źródło