基本オブジェクトの重複するフラグメントをすべて削除するためのシェーダを作成しようとしています。私はこの問題の解決策を見つけましたが、これは本当に役に立ちました。Unity Shader:同じステンシル値を持つ2つのレイヤーをオーバーラップする
私にとっては、このリンク(Unity shader highlighting overlaps)が最も有用でした。
しかし、今私は別の問題があります。写真には、通常同じサイズと透明な背景を持つ6つのボタンがあります。これらのボタンの1つが選択されると、それはその隣人と重なります。
次の図は、カスタムシェーダーの外観を示しています。私は、画像を表示するために背景を穴を開けることによって問題を解決しましたが、今はこれらのボタンにテキストを追加したいと思います。もし私が同じことをやり直すならば、そのテキストは不気味に見えるでしょう。
Shader "Custom/GUI/Mask" {
Properties
{
_Color("Color (white = none)", COLOR) = (1,1,1,1)
_MainTex("Texture", 2D) = "white" {}
_CutOff("Cut off", Range(-0.001,1)) = 0.1
}
SubShader
{
Tags{ "RenderType" = "Transparent" "Queue" = "Geometry" }
LOD 100
Blend SrcAlpha OneMinusSrcAlpha
ZWrite off
Pass
{
Stencil
{
Ref 0
Comp Equal
Pass IncrSat
Fail IncrSat
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform float4 _MainTex_ST;
float4 _Color;
float _CutOff;
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
float4 color = tex2D(_MainTex, i.uv);
color.rgb *= _Color.rgb;
color.a *= _Color.a;
if (color.a <= _CutOff)
{
discard;
}
return color;
}
ENDCG
}
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
ZWrite off
Stencil
{
Ref 1
Comp Less
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 _Color;
uniform sampler2D _MainTex;
struct appdata
{
float4 vertex : POSITION;
float uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
float uv : TEXCOORD0;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
fixed4 color = tex2D(_MainTex, i.uv);
color.a = 0;
return color;
}
ENDCG
}
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
Stencil
{
Ref 2
Comp Less
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
float4 _Color;
struct appdata
{
float4 vertex : POSITION;
float uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
float uv : TEXCOORD0;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
fixed4 color = tex2D(_MainTex, i.uv);
color.a = 0;
return color;
}
ENDCG
}
}
}
この絵は、それが削除されたカスタムシェーダなしのようにどのように見えるか、を示しています。
次のコードは、私が透明箱に穴を切断することにより、私の問題を解決する方法について説明します重複部分。この図では、透明な背景には通常0のステンシル値があり、重なると値は1に変わります。問題は、背景のイメージもステンシル値1を持つことです。 1のステンシル値を持つオブジェクトをすべて削除すると、透明な背景のすべてのイメージが削除されます。ところで、画像と背景には同じシェーダが含まれています。
あなたは透明ボックスに穴を切断することなく、問題を解決するために私を助けてくださいことはできますか?カットスルーオプションには問題があります。透明なピクセルを持つ丸い画像があると、背景が非常に明るく輝きます。
ありがとうございました。