您的位置:首页 > 移动开发 > Unity3D

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

2016-12-01 17:09 1036 查看

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








其实是利用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遮罩住船精灵的部分。

ImageEffect MaskScript:
using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
[AddComponentMenu("Tracy/MaskShader")]
public class MaskScript : MonoBehaviour {
public Shader maskShader = null;

static Material m_Material = null;
public Texture background;
protected Material material
{
get
{
if (m_Material == null)
{
m_Material = new Material(maskShader);
m_Material.hideFlags = HideFlags.DontSave;
}
return m_Material;
}
}
protected void OnDisable()
{
if (m_Material)
{
DestroyImmediate(m_Material);
}
}
// Use this for initialization
void Start () {
if (!SystemInfo.supportsImageEffects)
{
enabled = false;
return;
}
// Disable if the shader can't run on the users graphics card
if (!maskShader || !material.shader.isSupported)
{
enabled = false;
return;
}
}

void OnRenderImage(RenderTexture source, RenderTexture destination)
{
int rtW = source.width;
int rtH = source.height;
RenderTexture buffer = RenderTexture.GetTemporary(rtW, rtH, 24);
material.SetTexture("_Background", background);
Graphics.Blit(buffer, destination, material);

RenderTexture.ReleaseTemporary(buffer);
}
}


MaskShader
Shader "Tracy/MaskShader" {
Properties{
_MainTex("Base (RGB)", 2D) = "" {}
_Background("Background Texture",2D) = ""{}
}

// Shader code pasted into all further CGPROGRAM blocks
CGINCLUDE

#include "UnityCG.cginc"

struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};

sampler2D _MainTex;//摄像机的输出画面作为纹理
sampler2D _Background;//背景
sampler2D_float _CameraDepthTexture;//没用,修改自StandardAsset的imageeffect

v2f vert(appdata_img v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.texcoord.xy;
return o;
}

float4 frag(v2f i) : SV_Target
{
//float d = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv.xy);
//d = Linear01Depth(d);
float4 c = tex2D(_MainTex, i.uv.xy);
float4 cbg = tex2D(_Background, i.uv.xy);
return float4(cbg.r, cbg.g, cbg.b, 1 - c.a);//翻转alpha
}

ENDCG

Subshader {

Pass{
ZTest Always Cull Off ZWrite Off

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
}
}

Fallback off

} // shader


unitypackage:
这里
点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Unity