UI特效裁剪

阅读: 评论:0

UI特效裁剪

UI特效裁剪

NGUI中并没有提供特效裁剪的功能,这个需要我们自己实现了。
不过实现起来也容易。
我们先来看一下,NGUI的裁剪原理(这里我就不写了,直接上链接)

知道裁剪原理之后我们自己就可以仿照NGUI的做法,将panel的裁剪信息传到特效Shader中实现裁剪,你完全可以不参考这种方式自己实现。
这里我只是实现了一个父panel的裁剪,多个panel的话就会出现不正确,不过一般情况下不会出panel之间交叉裁剪。

脚本代码

using UnityEngine;
using System.Collections;public class UIParticalClip : MonoBehaviour
{private UIPanel mPanel;private Renderer[] mSenderers;private bool mRefresh = false;void Start(){mRefresh = false;mPanel = gameObject.GetComponentInParent<UIPanel>();mSenderers = gameObject.GetComponentsInChildren<Renderer>();if (mPanel != null){ClipMove += SetClip;}}void Update(){if (mRefresh == false){mRefresh = true;SetClip(mPanel);}}void SetClip(UIPanel panel){if (panel == null){return;}if (mSenderers == null){return;}Vector2 soft = panel.clipSoftness;var panelWorldCorners = panel.worldCorners;var leftBottom = panelWorldCorners[0];var rightTop = panelWorldCorners[2];var center = Vector3.Lerp(leftBottom, rightTop, 0.5f);var z = rightTop.x - leftBottom.x;var w = rightTop.y - leftBottom.y;var cr = new Vector4(center.x, center.y, z * 0.5f, w * 0.5f);Vector2 sharpness = new Vector2(1000.0f, 1000.0f);//if (soft.x > 0f) sharpness.x = cr.z / soft.x;//if (soft.y > 0f) sharpness.y = cr.w / soft.y;foreach (Renderer render in mSenderers){if (render != null){render.material.SetVector("_ClipRange0", new Vector4(-cr.x / cr.z, -cr.y / cr.w, 1f / cr.z, 1f / cr.w));render.material.SetVector("_ClipArgs0", new Vector2(sharpness.x, sharpness.y));}}}
}

Shader代码

Shader "Particle/UIParticleClip" {Properties {_TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)_MainTex ("Particle Texture", 2D) = "white" {}_ClipRange0 ("_ClipRange0",Vector) = (0.0, 0.0, 0.0, 0.0)_ClipArgs0 ("_ClipArgs0",Vector) = (1000.0, 1000.0, 0.0, 0.0)}SubShader {Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }Blend SrcAlpha OneFog { Mode off }ColorMask RGBACull Off Lighting Off ZWrite OffPass {CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_particles#include &#inc"sampler2D _MainTex;fixed4 _TintColor;float4 _ClipRange0;float4 _ClipArgs0;struct appdata_t {half4 vertex : POSITION;fixed4 color : COLOR;half2 texcoord : TEXCOORD0;};struct v2f {float4 vertex : SV_POSITION;fixed4 color : COLOR;half3 texcoord : TEXCOORD0;float2 worldPos : TEXCOORD1;};float4 _MainTex_ST;v2f vert (appdata_t v){v2f o;o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);o.color = v.rd.xy = TRANSFORM_rd,_MainTex);o.texcoord.z = 0;o.worldPos =  * _ClipRange0.zw + _;return o;}fixed4 frag (v2f i) : SV_Target{// Softness factorfloat2 factor = (float2(1.0, 1.0) - abs(i.worldPos)) * _ClipArgs0;fixed4 col = 2.0f * i.color * _TintColor * tex2D(_MainTex, );col.a *= clamp( min(factor.x, factor.y), 0.0, 1.0);return col;}ENDCG }}
}

本文发布于:2024-01-28 11:42:41,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17064133647168.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:特效   UI
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23