先展示一下效果:
文章图片
文章图片
文章图片
原理 (1)首先渲染后面的不透明物体(图中绿色和白色)
(2)然后渲染透明遮罩,第一个Pass记录透明遮罩的深度之后在绘制透明颜色,混合
(3)到绘制被遮住物体时,只要开启ZTest就可以使其深度测试失败,透明遮罩罩住的位置不绘制。
具体实现 遮罩部分
文章图片
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"
}
被遮罩部分
文章图片
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透明遮罩效果】未被遮罩部分
文章图片
推荐阅读
- 使用透明度实现Mask遮罩的Unity Shader
- Java|一篇文章带你吃透,Java界最神秘技术ClassLoader
- 开发|2017年,阿里巴巴开源的那些事
- oracle|为什么我要离开华尔街日报加盟Orcale
- 技术|android进行数据的存储
- 零信任|技术·原创 |技术息象SDP为企业数据安全保驾护航
- Android开发|Android与Unity通信的SDK(一)
- C#速成指南(从入门到进阶,实战WPF与Unity3D开发吾爱fen享)
- C#速成指南(从入门到进阶,实战WPF与Unity3D开发)