Sombreador que "corta" el agujero a través de toda la geometría

10

¿Cómo puedo crear un sombreador que "corte" toda la geometría y solo muestre el fondo de limpieza en Unity? Un ejemplo:

ingrese la descripción de la imagen aquí

Eso es un prisma en una gran habitación blanca en forma de caja. La superficie del prisma solo representa el skybox de la escena (un cielo estrellado). Usé varias cámaras, lo cual es bastante ineficiente ... Debe haber una manera con solo sombreadores.

¿Cómo puedo hacer esto?

CalebHC
fuente

Respuestas:

14

Ok, finalmente lo descubrí!

ingrese la descripción de la imagen aquí

Usted ve cómo la malla de la esfera "corta" a través del cilindro y el plano hasta la caja del cielo. Esto me llevó más tiempo de lo esperado para resolver esto, pero gracias a una página wiki ( http://wiki.unity3d.com/index.php/DepthMask ) lo resolví todo.

Antes de usar la configuración del sombreador en la página wiki, estaba usando tres cámaras diferentes con diferentes indicadores de limpieza / profundidad para lograr el mismo resultado. Funcionó pero se ahogó totalmente con el Ouya. La solución anterior requiere solo una cámara y funciona mucho fasta.

Así que preparé la escena como tal ...

  1. se agregó un skybox realista (nasa)

  2. agregó algunas formas

  3. agregó el script SetRenderQueue al plano, esfera y cilindro

  4. establecer el orden de la cola en la esfera a 2999 (los otros objetos están en 3000)

  5. luego agregó el sombreador de máscara de profundidad a la esfera

Eso es. Cualquier pregunta házmelo saber!

CalebHC
fuente
2
Oh, estaba pensando demasiado en el problema en mi publicación anterior (estaba pensando en mallas de agujeros planos en paredes / pisos, realmente). La solución vinculada muestra un objeto de agujero 3D, y la solución que se muestra, para este caso, es muy simple: todo lo que necesita hacer es escribir el 'agujero' en el búfer z sin escribir ningún color, y asegurarse de que el agujero sea dibujado temprano.
bluescrn
@bluescrn ¡No te preocupes! Agradezco la publicación detallada. :)
CalebHC
2

Un par de opciones para obtener el efecto que deseas, pero tienen un costo:

  • Escriba los agujeros en el búfer de la galería de símbolos o en el canal alfa de destino, luego dibuje el skybox al final, usando una prueba de galería de símbolos o mezcla alfa adecuada, y sin prueba z.

o

  • Representa el skybox en una textura al comienzo del marco y proyecta eso en la 'geometría del agujero'

Sospecho que también debe haber una manera de hacer esto usando / abusando del búfer z, pero probablemente desee hacer una prueba z de los 'polígonos de agujeros' usando su Z real, luego escribir una Z diferente. Probablemente podría usar Pases múltiples y el búfer de la plantilla: dibujar el agujero 3 veces con el renderizado configurado de esta manera podría funcionar:

  • Pase 1: Sin prueba z, plantilla transparente debajo de poys de agujeros
  • Pase 2: prueba z normal, valor de plantilla de incremento (donde pasa la prueba de profundidad)
  • Pase 3: Borrar Z donde plantilla> 0

Sin embargo, aún necesitaría dibujar en un orden específico: primero el entorno, luego los agujeros y finalmente el skybox.

bluescrn
fuente