Я пытаюсь написать шейдер для единства, который выделит перекрывающиеся фрагменты сеток. Он должен работать для одного объекта, перекрывающего себя, а также для нескольких объектов.
Результат должен выглядеть как прикрепленное изображение.
Сначала я попытался выполнить это с обнаружением конфликтов, но я думаю, что лучший способ - написать шейдер.
Я не очень хорошо знаком с шейдерами, поэтому, если бы кто-нибудь мог мне помочь, я был бы благодарен.
Я думаю, что это можно сделать с помощью трафаретных шейдеров, например здесь http://docs.unity3d.com/Manual/SL-Stencil.html но эти шейдеры визуализируют только пересечение двух объектов без рендеринга всего объекта.
Я также нашел шейдер на основе Depth (https://chrismflynn.wordpress.com/2012/09/06/fun-with-shaders-and-the-depth-buffer/), но это также работает на двух объектах и не работает на одной сетке, что перекрытие себя
Что касается комментария @Zze с идеей о двух проходах, у меня теперь два шейдера. И он работает на двух объектах, когда у одного есть один шейдер, а другой - второй.
Может кто-нибудь может помочь мне объединить его в один шейдер, который будет работать и в объекте, который будет перекрываться?
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
}
}
}