Unity利用UI的Mask实现对精灵Sprite的遮挡

Unity中使用MaskShader实现船只河流效果
本文介绍如何在Unity中使用MaskShader实现船只在河流上的显示效果,通过分层渲染建立Mask蒙版层,并利用Camera渲染到RenderTexture生成动态纹理。详细步骤包括设置MaskShader、创建匹配屏幕的RenderTexture及实现Alpha通道反转。

例如剔除掉船超出河流的一部分,实现让船只在河流之上显示。


其实是利用UI层的Mask实现遮罩,有些不同的是Mask的图片是用Camera渲染到RenderTexture动态产生的纹理实现的。
大概步骤如下:
1 分层渲染,建立Mask蒙版层。
2 河流设置为Mask层。
3 建立Mask Camera,只渲染Mask蒙版层
4 创建脚本MatchScreenRenderTexture,创建与窗口匹配的RenderTexture,令Mask Camera渲染到该RenderTexture中。
5 创建脚本MaskScript,建立一个MaskShader(类似于全屏特效),令MaskCamera渲染的颜色部分背景部分透明变成不透明,即反转Alpha。
6 建立UI Image。设置Image为窗口大小,设置使用MatchScreenRenderTexture中的蒙版纹理。
7 添加Mask组件,令Image遮罩住船精灵的部分。

 1 Shader "Tracy/MaskShader" {  
 2     Properties{  
 3         _MainTex("Base (RGB)", 2D) = "" {}  
 4         _Background("Background Texture",2D) = ""{}  
 5     }  
 6   
 7         // Shader code pasted into all further CGPROGRAM blocks  
 8         CGINCLUDE  
 9   
10 #include "UnityCG.cginc"  
11   
12     struct v2f {  
13         float4 pos : SV_POSITION;  
14         float2 uv : TEXCOORD0;  
15     };  
16       
17     sampler2D _MainTex;//摄像机的输出画面作为纹理  
18     sampler2D _Background;//背景  
19     sampler2D_float _CameraDepthTexture;//没用,修改自StandardAsset的imageeffect  
20   
21     v2f vert(appdata_img v)  
22     {  
23         v2f o;  
24         o.pos = mul(UNITY_MATRIX_MVP, v.vertex);  
25         o.uv = v.texcoord.xy;  
26         return o;  
27     }  
28   
29     float4 frag(v2f i) : SV_Target  
30     {  
31         //float d = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv.xy);  
32         //d = Linear01Depth(d);  
33         float4 c = tex2D(_MainTex, i.uv.xy);  
34         float4 cbg = tex2D(_Background, i.uv.xy);  
35         return float4(cbg.r, cbg.g, cbg.b, 1 - c.a);//翻转alpha  
36     }  
37   
38         ENDCG  
39   
40         Subshader {  
41   
42         Pass{  
43             ZTest Always Cull Off ZWrite Off  
44   
45             CGPROGRAM  
46 #pragma vertex vert  
47 #pragma fragment frag  
48             ENDCG  
49         }  
50     }  
51   
52     Fallback off  
53   
54 } // shader  

 

转载于:https://www.cnblogs.com/AaronBlogs/p/7110198.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值