例如剔除掉船超出河流的一部分,实现让船只在河流之上显示。
其实是利用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