기본 오브젝트의 모든 겹치는 부분을 제거하는 단일화 쉐이더를 작성하려고합니다. 나는이 문제에 대한 다른 해결책을 발견했는데, 이것은 실제로 도움이되었다.Unity Shader : 동일한 스텐실 값을 가진 두 개의 레이어 겹침
나를 위해이 링크 (Unity shader highlighting overlaps)가 가장 유용했습니다.
하지만 이제는 또 다른 문제가 있습니다. 사진에는 보통 크기가 같고 투명한 배경을 가진 6 개의 버튼이 있습니다. 이 단추들 중 하나가 선택되면 이웃 단추가 겹칩니다.
다음 그림은 사용자 정의 셰이더의 모양을 보여줍니다. 배경을 채우기 위해 구멍을 뚫어 문제를 해결했지만 지금은이 버튼에 텍스트를 추가하고 싶습니다. 만약 내가 똑같은 일을 다시한다면, 텍스트는 엉망이 될 것입니다.
다음 코드는 내가 투명 상자에 구멍을 절단하여 내 문제를 해결하는 방법을 보여줍니다 :
이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입니다. 따라서 if 스텐실 값이 1 인 모든 객체를 제거하면 투명 배경에있는 모든 이미지가 제거됩니다. 그런데 이미지와 배경에는 같은 쉐이더가 있습니다.
당신은 투명 상자에 구멍을 절단하지 않고 내가 문제를 해결하는 데 도움이시겠습니까? 절삭 옵션에는 문제가 있습니다. 투명 픽셀이있는 둥근 이미지가 있으면 배경이 매우 밝게 빛납니다.
도움 주셔서 감사합니다.