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:
这里
点击打开链接
相关文章推荐
- 利用OpenGL点精灵实现云模拟(Cloud Simulation Using OpenGL PointSprite)
- Unity Mask遮挡模型忽略UI
- 利用OpenGL点精灵实现云模拟(Cloud Simulation Using OpenGL PointSprite)
- 【unity插件】Sprite Mask--在unity实现类似flash那样非常丰富的遮罩功能
- UI特效--Android利用ViewFlipper实现屏幕切换动画效果
- 利用cocostudio库函数 实现左右滑动的背包栏UI (cocos2d-x 2.2.0)
- 利用CEGUI+Lua实现灵活的游戏UI框架
- 【iOS功能实现】之利用UIDocumentInteractionController打开和预览文档
- android利用apkplug框架实现主应用与插件通讯(传递任意对象)实现UI替换
- Unity利用NGUI实现自定义鼠标
- 利用Unity来实现插件开发
- Unity中当Uisprite组件切换图片时的小技能
- Warensoft Unity3D通信库使用向导2-利用UnityHttpClient类实现Http通信
- 利用Handler来更新android的UI实现动画
- PHP持续保有长连接,利用flush()持续更新浏览器UI,下载进度条实现
- Unity利用NGUI实现自定义鼠标
- 用仿ActionScript的语法来编写html5——第二篇,利用Sprite来实现动画
- 如何利用EnteLib Unity Interception Extension 和PIAB实现Transaction
- 【自己写个AS3组件库】之 “扩展Sprite类,实现销毁和UI重绘机制”
- cocos2d-x 基于CCClippingNode实现CCLayer遮罩功能,在滑动时超出剪切区域的实现显示部分的效果,不需要再借助其他sprite来遮挡了