Ich möchte in Unity einen durchsichtigen Effekt wie in den folgenden Beispielen erzielen:
In meinem speziellen Szenario gibt es einige Anforderungen:
- Sprites verwenden Alpha-Blending und Sprites haben transparente Bereiche.
- Es gibt zwei Arten von Elementen, die den Charakter verdecken. Einer sollte den Silhouette-Effekt erzeugen und der andere sollte sich wie normal verhalten.
Zum Verschließen von Elementen, die die Silhouette erstellen, aktiviere ich ZWrite und deaktiviere es für Elemente, die dies nicht tun.
Für den Charakter habe ich versucht, die Warteschlange des Shaders auf transparent + 1 zu setzen und diesen Durchgang hinzugefügt:
Pass
{
ZTest Greater
Lighting Off
Color [_Color]
}
Und der Effekt funktioniert teilweise:
Die Silhouette wird über den gesamten Charakter gezeichnet, auch über die Teile, die transparent sind. Transparente Teile sollten keine Silhouette bilden.
Die Silhouette wird erstellt, wenn sich der Charakter hinter einem Sprite befindet, auch wenn dieser Teil des Sprites transparent ist. Hinter einem transparenten Teil des Sprites zu stehen, sollte die Silhouette nicht erzeugen.
Der Charakter erscheint vor den restlichen Elementen, auch wenn er sich hinter ihnen befindet. Ich denke, das liegt daran, dass die Warteschlange auf Transparent + 1 gesetzt wurde. Aber wenn ich es als Transparent belasse, wird das Zeichen in der richtigen Reihenfolge gezeichnet, aber die Silhouette wird nie gesehen.
Ich habe versucht, die folgenden Tipps zu befolgen, die mir jemand gegeben hat, aber ich kann sie nicht zum Laufen bringen:
1) Lassen Sie den Pass, der die Sprites rendert, unverändert.
2) Fügen Sie einen Durchgang hinzu, der in den Z-Puffer schreibt, aber einen Shader hat, der clip () verwendet, um auf Alpha basierende Pixel zu verwerfen. Sie können den Z-Puffer nicht verwenden, um weiche Z-Tests durchzuführen, ohne MSAA und Alpha-to-Coverage zu verwenden. Die Qualität davon wird nicht großartig sein, aber es ist das Beste, was Sie tun können. Eine schnellere Alternative ist eine Muster- oder Rauschschwankung oder eine gute altmodische Schwelle, wenn Ihre Sprites alle ziemlich scharfe Kanten haben.
3) Fügen Sie okkludierbaren Objekten, die die Okklusionsfarbe mit dem Z-Test zeichnen, einen dritten Durchgang hinzu und stellen Sie sicher, dass dieser als letzter Durchgang gezeichnet wurde.
Ich bin ein bisschen neu für Shader, besonders in Unity, und ich kann einfach nicht herausfinden, wie es richtig funktioniert.