我正在尝试为团结编写着色器,以突出网格的重叠片段。它应该适用于一个重叠自身的对象以及多个对象。
首先,我尝试使用碰撞检测来完成此操作,但我认为最好的方法是编写着色器。
我对着色器不太熟悉,所以如果有人能帮助我,我将不胜感激。
我认为可以使用像http://docs.unity3d.com/Manual/SL-Stencil.html这样的模板着色器来完成 但是这个着色器只渲染两个对象的交集而不渲染整个对象。
我还发现基于深度(https://chrismflynn.wordpress.com/2012/09/06/fun-with-shaders-and-the-depth-buffer/)的着色器,但这也适用于两个对象,并且不能在一个自身重叠的网格上工作
关于@Zze评论关于两个Pass的想法我现在有两个着色器。当一个具有一个着色器而另一个具有第二个对象时,它适用于两个对象。
也许任何人都可以帮助我如何将它组合成一个着色器,该着色器也可以在自身重叠的对象中工作?
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
}
}
}