Shader che "taglia" il foro attraverso tutta la geometria


10

Come posso creare uno shader che "tagli" tutta la geometria, rendendo solo lo sfondo di schiarimento in Unity? Un esempio:

inserisci qui la descrizione dell'immagine

È un prisma in un'enorme stanza a forma di scatola bianca. La superficie del prisma sta solo rendendo lo skybox della scena (un cielo stellato). Ho usato più telecamere, il che è piuttosto inefficiente ... Deve esserci un modo con solo shader.

Come posso fare questo?

Risposte:


14

Ok, finalmente capito!

inserisci qui la descrizione dell'immagine

Vedi come la maglia a sfera “taglia” il cilindro e spiana fino allo skybox. Mi ci è voluto più tempo del previsto per capirlo, ma grazie a una pagina wiki ( http://wiki.unity3d.com/index.php/DepthMask ) ho capito tutto.

Prima di utilizzare la configurazione dello shader nella pagina wiki, per ottenere lo stesso risultato utilizzavo tre telecamere diverse con flag di cancellazione / profondità diversi. Ha funzionato ma ha completamente soffocato l'Ouya. La soluzione di cui sopra richiede solo una telecamera ed esegue molta fasta.

Quindi ho impostato la scena come tale ...

  1. aggiunto uno skybox realistico (nasa)

  2. aggiunto alcune forme

  3. aggiunto lo script SetRenderQueue al piano, alla sfera e al cilindro

  4. imposta l'ordine delle code sulla sfera su 2999 (gli altri oggetti sono a 3000)

  5. quindi aggiunto lo shader DepthMask alla sfera

Questo è tutto. Se ci sono domande, fatemelo sapere!


2
D'oh, stavo pensando troppo al problema nel mio post sopra (stavo pensando a maglie a foro piatto su pareti / pavimenti, davvero). La soluzione collegata mostra un oggetto foro 3D e la soluzione mostrata, in questo caso, è molto semplice: tutto ciò che devi fare è scrivere il 'buco' nel buffer z senza scrivere alcun colore e assicurarti che il foro sia disegnato in anticipo.
bluescrn,

@bluescrn Nessun problema! Apprezzo il post dettagliato. :)
CalebHC

2

Un paio di opzioni per ottenere l'effetto desiderato, ma hanno un costo:

  • Scrivi i fori nel buffer dello stencil o nel canale alfa di destinazione, quindi disegna l'ultimo skybox, usando un test dello stencil o una fusione alfa adeguati e senza z-test?

o

  • Rendering dello skybox su una trama all'inizio del fotogramma e proiettalo sulla "geometria del foro"

Ho il sospetto che ci debba essere un modo per farlo anche usando / abusando del buffer z, ma probabilmente vorrai testare i "poligoni del buco" usando la loro Z reale, quindi scrivere una Z diversa. Probabilmente potresti usare passaggi multipli e il buffer dello stencil: disegnare il buco 3 volte con il rendering del rendering in questo modo potrebbe funzionare:

  • Passa 1: nessun test z, cancella lo stencil sotto i poli del foro
  • Passa 2: Test z normale, Incrementa il valore dello stencil (dove passa il test di profondità)
  • Passaggio 3: Cancella Z dove stencil> 0

Avresti comunque bisogno di disegnare in un ordine specifico: prima l'ambiente, poi i buchi e infine lo skybox per ultimo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.