资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

Unity3DUGUI特效之Image高斯模糊效果-创新互联

这几天研究了下模糊特效,看了很多文章,其原理就是拿取图片或屏幕数据,然后将周围的元素和目标位置的颜色值进行一个融合计算,然后自己写了一个小小的测试程序。

创新互联公司主要业务有网站营销策划、网站设计、成都做网站、微信公众号开发、成都微信小程序、H5技术、程序开发等业务。一次合作终身朋友,是我们奉行的宗旨;我们不仅仅把客户当客户,还把客户视为我们的合作伙伴,在开展业务的过程中,公司还积累了丰富的行业经验、成都全网营销资源和合作伙伴关系资源,并逐渐建立起规范的客户服务和保障体系。 

这个模糊也可以分成两种,一个是自身模糊,一个是从屏幕上取值进行模糊。第一个用于一些小的列表展示,比如未解锁时,是模糊的。第二个是凸显弹框效果的,将背景都模糊掉,自己将这个稍微加强了些可以指定模糊一个位置。

针对移动平台,使用高斯模糊,其实效率不是很高,如果要很好的效果,那么速度卡;如果要速度快,那么效果达不到要求。但是还是在这里记录下,兴许以后能用上。

先说第一个,挂在Image下的模糊特效。

Shader "Custom/FrontBlur" {
 Properties
 {
 [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
 _Color ("Tint", Color) = (1,1,1,1)
 
 [HideInInspector]_StencilComp ("Stencil Comparison", Float) = 8
 [HideInInspector]_Stencil ("Stencil ID", Float) = 0
 [HideInInspector]_StencilOp ("Stencil Operation", Float) = 0
 [HideInInspector]_StencilWriteMask ("Stencil Write Mask", Float) = 255
 [HideInInspector]_StencilReadMask ("Stencil Read Mask", Float) = 255

 [HideInInspector]_ColorMask ("Color Mask", Float) = 15

 [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
 
 _Size ("Size", Range(0, 50)) = 5
 }

 SubShader
 {
 Tags
 { 
 "Queue"="Transparent" 
 "IgnoreProjector"="True" 
 "RenderType"="Transparent" 
 "PreviewType"="Plane"
 "CanUseSpriteAtlas"="True"
 }
 
 Stencil
 {
 Ref [_Stencil]
 Comp [_StencilComp]
 Pass [_StencilOp] 
 ReadMask [_StencilReadMask]
 WriteMask [_StencilWriteMask]
 }

 Cull Off
 Lighting Off
 ZWrite Off
 ZTest [unity_GUIZTestMode]
 Blend SrcAlpha OneMinusSrcAlpha
 ColorMask [_ColorMask]

 Pass
 {
 Name "FrontBlurHor"
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag
 #pragma target 2.0

 #include "UnityCG.cginc"
 #include "UnityUI.cginc"

 #pragma multi_compile __ UNITY_UI_ALPHACLIP
 
 struct appdata_t
 {
 float4 vertex : POSITION;
 float4 color : COLOR;
 float2 texcoord : TEXCOORD0;
 UNITY_VERTEX_INPUT_INSTANCE_ID
 };

 struct v2f
 {
 float4 vertex : SV_POSITION;
 fixed4 color : COLOR;
 float2 texcoord : TEXCOORD0;
 float4 worldPosition : TEXCOORD1;
 UNITY_VERTEX_OUTPUT_STEREO
 };
 
 fixed4 _Color;
 fixed4 _TextureSampleAdd;
 float4 _ClipRect;

 v2f vert(appdata_t IN)
 {
 v2f OUT;
 UNITY_SETUP_INSTANCE_ID(IN);
 UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
 OUT.worldPosition = IN.vertex;
 OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);

 OUT.texcoord = IN.texcoord;
 
 OUT.color = IN.color * _Color;
 return OUT;
 }

 sampler2D _MainTex;
 float4 _MainTex_TexelSize;
 float _Size;

 half4 GrabPixel(v2f i, float weight, float kernelx){
 if (_Size <= 1 || weight == 0){
  return tex2D(_MainTex, half2(i.texcoord.x + _MainTex_TexelSize.x*kernelx*_Size, i.texcoord.y)) * weight;
 }else{
  half4 sum = half4(0,0,0,0);
  sum += tex2D(_MainTex, half2(i.texcoord.x + _MainTex_TexelSize.x*kernelx*_Size*0.2, i.texcoord.y))*0.2;
  sum += tex2D(_MainTex, half2(i.texcoord.x + _MainTex_TexelSize.x*kernelx*_Size*0.4, i.texcoord.y))*0.2;
  sum += tex2D(_MainTex, half2(i.texcoord.x + _MainTex_TexelSize.x*kernelx*_Size*0.6, i.texcoord.y))*0.2;
  sum += tex2D(_MainTex, half2(i.texcoord.x + _MainTex_TexelSize.x*kernelx*_Size*0.8, i.texcoord.y))*0.2;
  sum += tex2D(_MainTex, half2(i.texcoord.x + _MainTex_TexelSize.x*kernelx*_Size*1.0, i.texcoord.y))*0.2;
  return (sum + _TextureSampleAdd) * weight;
 }
 }

 half4 GrabPixely(v2f i, float weight, float kernely){
 if (_Size <= 1 || weight == 0){
  return tex2D(_MainTex, half2(i.texcoord.x, i.texcoord.y + _MainTex_TexelSize.y*kernely*_Size)) * weight;
 }else{
  half4 sum = half4(0,0,0,0);
  sum += tex2D(_MainTex, half2(i.texcoord.x, i.texcoord.y + _MainTex_TexelSize.y*kernely*_Size*0.2))*0.2;
  sum += tex2D(_MainTex, half2(i.texcoord.x, i.texcoord.y + _MainTex_TexelSize.y*kernely*_Size*0.4))*0.2;
  sum += tex2D(_MainTex, half2(i.texcoord.x, i.texcoord.y + _MainTex_TexelSize.y*kernely*_Size*0.6))*0.2;
  sum += tex2D(_MainTex, half2(i.texcoord.x, i.texcoord.y + _MainTex_TexelSize.y*kernely*_Size*0.8))*0.2;
  sum += tex2D(_MainTex, half2(i.texcoord.x, i.texcoord.y + _MainTex_TexelSize.y*kernely*_Size*1.0))*0.2;
  return (sum + _TextureSampleAdd) * weight;
 }
 }

 fixed4 frag(v2f IN) : SV_Target
 {
 half4 sum = half4(0,0,0,0);
 // #define GRABPIXEL(weight, kernelx) (tex2D(_MainTex, half2(IN.texcoord.x + _MainTex_TexelSize.x * kernelx*_Size, IN.texcoord.y)) + _TextureSampleAdd) * weight
 
 // sum += GrabPixel(IN, 0.05, -4.0);
 // sum += GrabPixel(IN, 0.09, -3.0);
 // sum += GrabPixel(IN, 0.12, -2.0);
 // sum += GrabPixel(IN, 0.15, -1.0);
 // sum += GrabPixel(IN, 0.18, 0.0);
 // sum += GrabPixel(IN, 0.15, +1.0);
 // sum += GrabPixel(IN, 0.12, +2.0);
 // sum += GrabPixel(IN, 0.09, +3.0);
 // sum += GrabPixel(IN, 0.05, +4.0);

 for(int i=0;i<9;i++){
  sum += GrabPixel(IN, 1.0/9, i-4.0);
 }

 // half4 sumy = half4(0,0,0,0);
 // for(int i=0;i<15;i++){
 // sumy += GrabPixely(IN, 1.0/15, i-7.0);
 // }
 // half4 sum = (sumx + sumy) * 0.5;

 // sum += GrabPixel(IN, 0.01, -9.0);
 // sum += GrabPixel(IN, 0.02, -8.0);
 // sum += GrabPixel(IN, 0.03, -7.0);
 // sum += GrabPixel(IN, 0.04, -6.0);
 // sum += GrabPixel(IN, 0.05, -5.0);
 // sum += GrabPixel(IN, 0.06, -4.0);
 // sum += GrabPixel(IN, 0.07, -3.0);
 // sum += GrabPixel(IN, 0.08, -2.0);
 // sum += GrabPixel(IN, 0.09, -1.0);
 // sum += GrabPixel(IN, 0.10, 0.0);
 // sum += GrabPixel(IN, 0.09, +1.0);
 // sum += GrabPixel(IN, 0.08, +2.0);
 // sum += GrabPixel(IN, 0.07, +3.0);
 // sum += GrabPixel(IN, 0.06, +4.0);
 // sum += GrabPixel(IN, 0.05, +5.0);
 // sum += GrabPixel(IN, 0.04, +6.0);
 // sum += GrabPixel(IN, 0.03, +7.0);
 // sum += GrabPixel(IN, 0.02, +8.0);
 // sum += GrabPixel(IN, 0.01, +9.0);

 sum = sum * IN.color;
 sum.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
 #ifdef UNITY_UI_ALPHACLIP
 clip (sum.a - 0.001);
 #endif
 return sum;

 // float distance = _Distance;

 // fixed4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;

 // color += (tex2D(_MainTex, half2(IN.texcoord.x + distance, IN.texcoord.y + distance)) + _TextureSampleAdd) * IN.color;
 // color += (tex2D(_MainTex, half2(IN.texcoord.x + distance, IN.texcoord.y)) + _TextureSampleAdd) * IN.color;
 // color += (tex2D(_MainTex, half2(IN.texcoord.x + distance, IN.texcoord.y - distance)) + _TextureSampleAdd) * IN.color;
 // color += (tex2D(_MainTex, half2(IN.texcoord.x, IN.texcoord.y - distance)) + _TextureSampleAdd) * IN.color;
 // color += (tex2D(_MainTex, half2(IN.texcoord.x - distance, IN.texcoord.y - distance)) + _TextureSampleAdd) * IN.color;
 // color += (tex2D(_MainTex, half2(IN.texcoord.x - distance, IN.texcoord.y)) + _TextureSampleAdd) * IN.color;
 // color += (tex2D(_MainTex, half2(IN.texcoord.x - distance, IN.texcoord.y + distance)) + _TextureSampleAdd) * IN.color;
 // color += (tex2D(_MainTex, half2(IN.texcoord.x, IN.texcoord.y + distance)) + _TextureSampleAdd) * IN.color;
 // color /= 9;
 
 // color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
 
 // #ifdef UNITY_UI_ALPHACLIP
 // clip (color.a - 0.001);
 // #endif

 // return color;
 }
 ENDCG
 }
 Pass
 {
 Name "FrontBlurVer"
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag
 #pragma target 2.0

 #include "UnityCG.cginc"
 #include "UnityUI.cginc"

 #pragma multi_compile __ UNITY_UI_ALPHACLIP
 
 struct appdata_t
 {
 float4 vertex : POSITION;
 float4 color : COLOR;
 float2 texcoord : TEXCOORD0;
 UNITY_VERTEX_INPUT_INSTANCE_ID
 };

 struct v2f
 {
 float4 vertex : SV_POSITION;
 fixed4 color : COLOR;
 float2 texcoord : TEXCOORD0;
 float4 worldPosition : TEXCOORD1;
 UNITY_VERTEX_OUTPUT_STEREO
 };
 
 fixed4 _Color;
 fixed4 _TextureSampleAdd;
 float4 _ClipRect;

 v2f vert(appdata_t IN)
 {
 v2f OUT;
 UNITY_SETUP_INSTANCE_ID(IN);
 UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
 OUT.worldPosition = IN.vertex;
 OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);

 OUT.texcoord = IN.texcoord;
 
 OUT.color = IN.color * _Color;
 return OUT;
 }

 sampler2D _MainTex;
 float4 _MainTex_TexelSize;
 float _Size;

 half4 GrabPixel(v2f i, float weight, float kernely){
 if (_Size <= 1 || weight == 0){
  return tex2D(_MainTex, half2(i.texcoord.x, i.texcoord.y + _MainTex_TexelSize.y*kernely*_Size)) * weight;
 }else{
  half4 sum = half4(0,0,0,0);
  sum += tex2D(_MainTex, half2(i.texcoord.x, i.texcoord.y + _MainTex_TexelSize.y*kernely*_Size*0.2))*0.2;
  sum += tex2D(_MainTex, half2(i.texcoord.x, i.texcoord.y + _MainTex_TexelSize.y*kernely*_Size*0.4))*0.2;
  sum += tex2D(_MainTex, half2(i.texcoord.x, i.texcoord.y + _MainTex_TexelSize.y*kernely*_Size*0.6))*0.2;
  sum += tex2D(_MainTex, half2(i.texcoord.x, i.texcoord.y + _MainTex_TexelSize.y*kernely*_Size*0.8))*0.2;
  sum += tex2D(_MainTex, half2(i.texcoord.x, i.texcoord.y + _MainTex_TexelSize.y*kernely*_Size*1.0))*0.2;
  return (sum + _TextureSampleAdd) * weight;
 }
 }

 fixed4 frag(v2f IN) : SV_Target
 {
 half4 sum = half4(0,0,0,0); 
 // #define GRABPIXEL(weight, kernely) (tex2D(_MainTex, half2(IN.texcoord.x, IN.texcoord.y + _MainTex_TexelSize.y * kernely*_Size)) + _TextureSampleAdd) * weight
 
 // sum += GrabPixel(IN, 0.05, -4.0);
 // sum += GrabPixel(IN, 0.09, -3.0);
 // sum += GrabPixel(IN, 0.12, -2.0);
 // sum += GrabPixel(IN, 0.15, -1.0);
 // sum += GrabPixel(IN, 0.18, 0.0);
 // sum += GrabPixel(IN, 0.15, +1.0);
 // sum += GrabPixel(IN, 0.12, +2.0);
 // sum += GrabPixel(IN, 0.09, +3.0);
 // sum += GrabPixel(IN, 0.05, +4.0);

 for(int i=0;i<9;i++){
  sum += GrabPixel(IN, 1.0/9, i-4.0);
 }

 // sum += GrabPixel(IN, 0.01, -9.0);
 // sum += GrabPixel(IN, 0.02, -8.0);
 // sum += GrabPixel(IN, 0.03, -7.0);
 // sum += GrabPixel(IN, 0.04, -6.0);
 // sum += GrabPixel(IN, 0.05, -5.0);
 // sum += GrabPixel(IN, 0.06, -4.0);
 // sum += GrabPixel(IN, 0.07, -3.0);
 // sum += GrabPixel(IN, 0.08, -2.0);
 // sum += GrabPixel(IN, 0.09, -1.0);
 // sum += GrabPixel(IN, 0.10, 0.0);
 // sum += GrabPixel(IN, 0.09, +1.0);
 // sum += GrabPixel(IN, 0.08, +2.0);
 // sum += GrabPixel(IN, 0.07, +3.0);
 // sum += GrabPixel(IN, 0.06, +4.0);
 // sum += GrabPixel(IN, 0.05, +5.0);
 // sum += GrabPixel(IN, 0.04, +6.0);
 // sum += GrabPixel(IN, 0.03, +7.0);
 // sum += GrabPixel(IN, 0.02, +8.0);
 // sum += GrabPixel(IN, 0.01, +9.0);

 sum = sum * IN.color;
 sum.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
 #ifdef UNITY_UI_ALPHACLIP
 clip (sum.a - 0.001);
 #endif
 return sum;

 // float distance = _Distance;

 // fixed4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;

 // color += (tex2D(_MainTex, half2(IN.texcoord.x + distance, IN.texcoord.y + distance)) + _TextureSampleAdd) * IN.color;
 // color += (tex2D(_MainTex, half2(IN.texcoord.x + distance, IN.texcoord.y)) + _TextureSampleAdd) * IN.color;
 // color += (tex2D(_MainTex, half2(IN.texcoord.x + distance, IN.texcoord.y - distance)) + _TextureSampleAdd) * IN.color;
 // color += (tex2D(_MainTex, half2(IN.texcoord.x, IN.texcoord.y - distance)) + _TextureSampleAdd) * IN.color;
 // color += (tex2D(_MainTex, half2(IN.texcoord.x - distance, IN.texcoord.y - distance)) + _TextureSampleAdd) * IN.color;
 // color += (tex2D(_MainTex, half2(IN.texcoord.x - distance, IN.texcoord.y)) + _TextureSampleAdd) * IN.color;
 // color += (tex2D(_MainTex, half2(IN.texcoord.x - distance, IN.texcoord.y + distance)) + _TextureSampleAdd) * IN.color;
 // color += (tex2D(_MainTex, half2(IN.texcoord.x, IN.texcoord.y + distance)) + _TextureSampleAdd) * IN.color;
 // color /= 9;
 
 // color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
 
 // #ifdef UNITY_UI_ALPHACLIP
 // clip (color.a - 0.001);
 // #endif

 // return color;
 }
 ENDCG
 }
 }
}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文题目:Unity3DUGUI特效之Image高斯模糊效果-创新互联
地址分享:http://cdkjz.cn/article/dpceeh.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220