Unity Shader透明遮罩效果

先展示一下效果:Unity Shader透明遮罩效果_第1张图片
Unity Shader透明遮罩效果_第2张图片
Unity Shader透明遮罩效果_第3张图片

原理

(1)首先渲染后面的不透明物体(图中绿色和白色)
(2)然后渲染透明遮罩,第一个Pass记录透明遮罩的深度之后在绘制透明颜色,混合
(3)到绘制被遮住物体时,只要开启ZTest就可以使其深度测试失败,透明遮罩罩住的位置不绘制。

具体实现

遮罩部分
Unity Shader透明遮罩效果_第4张图片

Shader "MyStudy/OpacityMask" 
{
	Properties 
	{
		_Color ("Color", Color) = (0,0,0,0)
	}
	SubShader
	{
		Tags{ "Queue" = "Transparent" "IgnoreProjector"="True" "RenderType" = "Transparent" }

		CGINCLUDE
		struct a2v
		{
			float4 vertex : POSITION ;

		};

		struct v2f
		{
			float4 pos : SV_POSITION;

		};

		float4 _Color;

		v2f vert(a2v i)
		{
			v2f o;
			o.pos = UnityObjectToClipPos(i.vertex);
			return o;
		}

		float4 frag(v2f i) : SV_Target
		{
			return float4(_Color.rgb, 0);
		}
		ENDCG 


		Pass
		{
			ZWrite On
			ColorMask 0 
		}

		Pass
		{
			Tags { "LightMode"="ForwardBase" }
			ZWrite Off
			Blend One One
			ZTest Off
			Stencil
			{
				Ref [_StencilRef]
				Comp Equal
				Pass Replace
				ZFail Keep
			}

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
		ENDCG
		}
		
	}
	FallBack "Diffuse"
}

被遮罩部分
Unity Shader透明遮罩效果_第5张图片

Shader "MyStudy/OpacityMaskee" 
{
	Properties 
	{
		_Color ("Color", Color) = (1,1,1,1)
	}
	SubShader
	{

		CGINCLUDE
		struct a2v
		{
			float4 vertex : POSITION ;

		};

		struct v2f
		{
			float4 pos : SV_POSITION;

		};

		float4 _Color;

		v2f vert(a2v i)
		{
			v2f o;
			o.pos = UnityObjectToClipPos(i.vertex);
			return o;
		}

		float4 frag(v2f i) : SV_Target
		{
			return _Color;
		}
		ENDCG 

		Pass
		{
			Tags { "LightMode"="ForwardBase" }
			ZTest On
			Cull Off
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
		ENDCG
		}
		
	}
	FallBack "Diffuse"
}

未被遮罩部分
Unity Shader透明遮罩效果_第6张图片

你可能感兴趣的:(技术,unity3d,shader)