Shader, der ein Loch durch die gesamte Geometrie „schneidet“

10

Wie kann ich einen Shader erstellen, der die gesamte Geometrie "durchschneidet" und nur den Clearing-Hintergrund in Unity rendert? Ein Beispiel:

Geben Sie hier die Bildbeschreibung ein

Das ist ein Prisma in einem riesigen weißen kastenförmigen Raum. Die Oberfläche des Prismas rendert nur die Skybox der Szene (einen Sternenhimmel). Ich habe mehrere Kameras verwendet, was ziemlich ineffizient ist ... Es muss einen Weg geben, nur Shader zu verwenden.

Wie kann ich das machen?

CalebHC
quelle

Antworten:

14

Ok, endlich herausgefunden!

Geben Sie hier die Bildbeschreibung ein

Sie sehen, wie das Kugelnetz durch den Zylinder „schneidet“ und bis zur Skybox planiert. Ich habe länger gebraucht als erwartet, um das herauszufinden, aber dank einer Wiki-Seite ( http://wiki.unity3d.com/index.php/DepthMask ) habe ich alles sortiert.

Bevor ich das Shader-Setup auf der Wiki-Seite verwendet habe, habe ich drei verschiedene Kameras mit unterschiedlichen Clearing- / Tiefen-Flags verwendet, um das gleiche Ergebnis zu erzielen. Es hat funktioniert, aber es hat die Ouya total erwürgt. Die obige Lösung erfordert nur eine Kamera und läuft viel schnell.

Also habe ich die Szene so eingerichtet ...

  1. fügte eine realistische Skybox (NASA) hinzu

  2. fügte einige Formen hinzu

  3. Das SetRenderQueue-Skript wurde zur Ebene, Kugel und zum Zylinder hinzugefügt

  4. Setzen Sie die Warteschlangenreihenfolge für die Kugel auf 2999 (die anderen Objekte befinden sich bei 3000).

  5. Fügen Sie dann den DepthMask-Shader zur Kugel hinzu

Das ist es. Fragen lassen Sie es mich wissen!

CalebHC
quelle
2
D'oh, ich habe das Problem in meinem obigen Beitrag völlig überlegt (ich habe wirklich über flache Lochgitter an Wänden / Böden nachgedacht). Die verknüpfte Lösung zeigt ein 3D-Lochobjekt, und die gezeigte Lösung ist in diesem Fall sehr einfach. Alles, was Sie tatsächlich tun müssen, ist, das 'Loch' in den Z-Puffer zu schreiben, ohne Farbe zu schreiben, und sicherzustellen, dass das Loch ist früh gezeichnet.
Bluescrn
@bluescrn Keine Sorge! Ich freue mich über den ausführlichen Beitrag. :)
CalebHC
2

Einige Optionen, um den gewünschten Effekt zu erzielen - aber sie sind kostenpflichtig:

  • Schreiben Sie die Löcher in den Schablonenpuffer oder den Ziel-Alpha-Kanal und zeichnen Sie dann zuletzt die Skybox mit einem geeigneten Schablonentest oder einer Alpha-Mischung und ohne Z-Test?

oder

  • Rendern Sie die Skybox zu Beginn des Rahmens in eine Textur und projizieren Sie diese auf die 'Lochgeometrie'.

Ich vermute, dass es einen Weg geben muss, dies auch durch Verwendung / Missbrauch des Z-Puffers zu tun - aber Sie möchten wahrscheinlich die 'Lochpolygone' mit ihrem echten Z z-testen und dann ein anderes Z schreiben. Sie könnten es wahrscheinlich verwenden Mehrere Durchgänge und der Schablonenpuffer - 3-maliges Zeichnen des Lochs mit dem so eingerichteten Renderstatus könnte funktionieren:

  • Pass 1: Kein Z-Test, Schablone unter Lochpolys löschen
  • Pass 2: Normaler Z-Test, Inkrement-Schablonenwert (wo der Tiefentest bestanden wird)
  • Pass 3: Löschen Sie Z, wobei die Schablone> 0 ist

Sie müssten immer noch in einer bestimmten Reihenfolge zeichnen - zuerst die Umgebung, dann die Löcher und zuletzt die Skybox.

Bluescrn
quelle