技术|Unity Shader透明遮罩效果

先展示一下效果:技术|Unity Shader透明遮罩效果
文章图片

技术|Unity Shader透明遮罩效果
文章图片

技术|Unity Shader透明遮罩效果
文章图片

原理 (1)首先渲染后面的不透明物体(图中绿色和白色)
(2)然后渲染透明遮罩,第一个Pass记录透明遮罩的深度之后在绘制透明颜色,混合
(3)到绘制被遮住物体时,只要开启ZTest就可以使其深度测试失败,透明遮罩罩住的位置不绘制。
具体实现 遮罩部分
技术|Unity Shader透明遮罩效果
文章图片

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透明遮罩效果
文章图片

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透明遮罩效果】未被遮罩部分
技术|Unity Shader透明遮罩效果
文章图片

    推荐阅读