Ich versuche, einen Shader für die Einheit zu schreiben, der die überlappenden Fragmente von Meshes hervorheben wird. Es sollte für ein Objekt, das sich selbst überlappt, sowie für mehrere Objekte funktionieren.Unity Shader Hervorhebung überlappt
Das Ergebnis sollte wie ein angehängtes Bild aussehen.
Zuerst habe ich versucht, dies mit Kollisionserkennung zu erreichen, aber ich denke, dass der beste Weg ist, einen Shader zu schreiben.
Ich bin nicht sehr vertraut mit Shadern, also wenn mir jemand helfen könnte wäre ich dankbar.
Ich denke, dass es durch die Verwendung von Stencil-Shadern wie hier http://docs.unity3d.com/Manual/SL-Stencil.html getan werden kann, aber diese Shader nur Schnittpunkt zweier Objekte ohne Rendering ganze Objekt.
Ich fand auch Shader basierend auf Tiefe (https://chrismflynn.wordpress.com/2012/09/06/fun-with-shaders-and-the-depth-buffer/) aber auch auf zwei Objekten arbeiten und funktioniert nicht auf ein Netz, das selbst ich habe jetzt zwei Shadern
In Bezug auf @Zze Kommentar mit Vorstellung über zwei Pass überlappen . Und es funktioniert auf zwei Objekte, wenn man einen Shader hat und andere zwei haben.
Vielleicht kann mir jemand helfen, wie man es zu einem Shader kombiniert, der auch in Objekten funktioniert, die sich überlappen?
ShaderOne
Shader "Custom/ShaderOne"
{
SubShader {
Tags { "RenderType"="Opaque" "Queue"="Geometry"}
Pass {
Stencil {
Ref 2
Comp always
Pass keep
Fail decrWrap
ZFail keep
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata {
float4 vertex : POSITION;
};
struct v2f {
float4 pos : SV_POSITION;
};
v2f vert(appdata v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
}
half4 frag(v2f i) : SV_Target {
return half4(0,1,0,1);
}
ENDCG
}
Pass {
Stencil {
Ref 2
Comp equal
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata {
float4 vertex : POSITION;
};
struct v2f {
float4 pos : SV_POSITION;
};
v2f vert(appdata v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
}
half4 frag(v2f i) : SV_Target {
return half4(0,0,1,1);
}
ENDCG
}
}
}
ShaderTwo
Shader "Custom/ShaderTwo"
{
SubShader {
Tags { "RenderType"="Opaque" "Queue"="Geometry"}
Pass {
Stencil {
Ref 2
Comp always
Pass replace
ZFail keep
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata {
float4 vertex : POSITION;
};
struct v2f {
float4 pos : SV_POSITION;
};
v2f vert(appdata v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
}
half4 frag(v2f i) : SV_Target {
return half4(1,0,0,1);
}
ENDCG
}
}
}
Das Ergebnis sieht aus wie ein Bild angehängt
Wenn die Schablone Shader die Schnittpunkte macht, dann, warum man nicht einen Shader mit 2 Pässe machen, die erste zieht normalerweise und dann die zweite ahmt das Ergebnis der Schablone Shader? – Zze
Vielleicht möchten Sie den Begriff der Tiefenschälung betrachten. Siehe [hier] (http://www.opengl-tutorial.com).org/intermediate-tutorials/tutorial-10-transparency /) und [hier] (http://www.eng.utah.edu/~cs5610/handouts/order_independent_transparency.pdf). Wie viele Objekte planen Sie auch? Wenn nicht viele, möchten Sie vielleicht jedes Objekt zu einer Textur rendern und sie dann wie einen Akkumulationspuffer kombinieren. – mrVoid
@mrVoid Ich denke, dass Tiefentests in dieser Situation nur mit der Kamera-Draufsicht funktioniert - aber wenn es Perspektive wird das nicht funktionieren? Ich habe Kopfschmerzen davon. vielleicht können Sie mir ein Beispiel für die Verwendung mit Beispielcode zur Verfügung stellen? – seek