Quiero lograr en Unity un efecto transparente como el de estos ejemplos:
En mi escenario específico hay un par de requisitos:
- Los sprites están usando la mezcla alfa, y los sprites tienen áreas transparentes.
- Hay 2 tipos de elementos que ocluyen el personaje. Uno debería crear el efecto de silueta, y el otro debería comportarse como normal.
Para ocluir elementos que crean la silueta, habilito ZWrite y lo deshabilito para elementos que no lo hacen.
Para el personaje, intenté establecer la cola del sombreador en transparente + 1, y agregué este pase:
Pass
{
ZTest Greater
Lighting Off
Color [_Color]
}
Y el efecto funciona parcialmente:
La silueta se dibuja por todo el personaje, incluso las partes que son transparentes. Las partes transparentes no deberían crear una silueta.
La silueta se crea cuando el personaje está detrás de un sprite, incluso si esa parte del sprite es transparente. Estar detrás de una parte transparente del sprite no debería crear la silueta.
El personaje aparece enfrente del resto de los elementos, incluso si está detrás de ellos. Supongo que esto se debe a establecer la cola en Transparente + 1. Pero si lo dejo como Transparente, el personaje se dibuja en el orden correcto, pero la silueta nunca se ve.
Traté de seguir estos consejos que alguien me dio, pero no puedo hacer que funcione:
1) Deje el pase que representa los sprites como está.
2) Agregue un pase que escriba en el z-buffer, pero que tenga un sombreador que use clip () para descartar píxeles basados en alfa. No puede usar el búfer z para hacer pruebas z suaves sin usar MSAA y cobertura alfa-to. La calidad de eso no será excelente, pero es lo mejor que puedes hacer. Una alternativa más rápida es un patrón o tramado de ruido, o un buen umbral a la antigua, si todos sus sprites tienen bordes bastante afilados.
3) Agregue el tercer pase a los objetos ocluibles que dibujan el color de la oclusión utilizando la prueba z y asegúrese de que se dibuje como un pase final.
Soy un poco nuevo en los sombreadores, especialmente en Unity, y no puedo entender cómo hacerlo funcionar correctamente.