這幾天研究了下模糊特效,看了很多文章,其原理就是拿取圖片或屏幕數(shù)據(jù),然后將周圍的元素和目標(biāo)位置的顏色值進(jìn)行一個(gè)融合計(jì)算,然后自己寫了一個(gè)小小的測(cè)試程序。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了懷柔免費(fèi)建站歡迎大家使用!
這個(gè)模糊也可以分成兩種,一個(gè)是自身模糊,一個(gè)是從屏幕上取值進(jìn)行模糊。第一個(gè)用于一些小的列表展示,比如未解鎖時(shí),是模糊的。第二個(gè)是凸顯彈框效果的,將背景都模糊掉,自己將這個(gè)稍微加強(qiáng)了些可以指定模糊一個(gè)位置。
針對(duì)移動(dòng)平臺(tái),使用高斯模糊,其實(shí)效率不是很高,如果要很好的效果,那么速度卡;如果要速度快,那么效果達(dá)不到要求。但是還是在這里記錄下,興許以后能用上。
先說第一個(gè),掛在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 } } }
里面分了兩個(gè)Pass來計(jì)算,這樣算出的效果會(huì)好很多,然后里面試了跟多的計(jì)算,越多的分層,那么得到的效果也越高,也意味著更加的不流暢。將shader放到一個(gè)新建的材質(zhì)球上,然后把材質(zhì)拖到Image組件的Material屬性欄上就可以了。
看看效果:
然后說第二個(gè)方式,它是將背景都給模糊的效果。
Shader "Custom/BackBlur" { Properties { [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} _Color ("Main Color", Color) = (1,1,1,1) _Size ("Size", Range(0, 20)) = 1 } Category { // We must be transparent, so other objects are drawn before this one. Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType" = "Plane" "CanUseSpriteAtlas" = "True" } SubShader { // Horizontal blur GrabPass { Tags { "LightMode" = "Always" } } Pass { Tags { "LightMode" = "Always" } Name "BackBlurHor" CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma fragmentoption ARB_precision_hint_fastest #include "UnityCG.cginc" struct appdata_t { float4 vertex : POSITION; float2 texcoord : TEXCOORD0; float4 color : COLOR; }; struct v2f { float4 vertex : POSITION; float4 uvgrab : TEXCOORD0; float4 color : COLOR; }; v2f vert (appdata_t v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); #if UNITY_UV_STARTS_AT_TOP float scale = -1.0; #else float scale = 1.0; #endif o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*scale) + o.vertex.w) * 0.5; o.uvgrab.zw = o.vertex.zw; o.color = v.color; return o; } sampler2D _GrabTexture; float4 _GrabTexture_TexelSize; float4 _MainTex_TexelSize; float _Size; uniform float4 _Color; // static float GaussianKernel[9] = { // 0.05, 0.09, 0.12, // 0.15, 0.18, 0.15, // 0.12, 0.09, 0.05 // }; // static float GaussianKernel[19] = { // 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, // 0.1, // 0.09, 0.08, 0.07, 0.06, 0.05, 0.04, 0.03, 0.02, 0.01, // }; // static float GaussianKernelD[19] = { // -9.0, -8.0, -7.0, -6.0, -5.0, -4.0, -3.0, -2.0, -1.0, // 0.0, // +1.0, +2.0, +3.0, +4.0, +5.0, +6.0, +7.0, +8.0, +9.0, // }; half4 GrabPixel(v2f i, float weight, float kernelx){ if (i.uvgrab.x == 0 && i.uvgrab.y == 0){ kernelx = 0; } return tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x + _GrabTexture_TexelSize.x*kernelx*_Size, i.uvgrab.y, i.uvgrab.z, i.uvgrab.w))) * weight; } half4 frag( v2f i ) : COLOR { half4 sum = half4(0,0,0,0); // #define GRABPIXEL(weight, kernelx) tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x + _GrabTexture_TexelSize.x * kernelx*_Size, i.uvgrab.y, i.uvgrab.z, i.uvgrab.w))) * weight sum += GrabPixel(i, 0.05, -4.0); sum += GrabPixel(i, 0.09, -3.0); sum += GrabPixel(i, 0.12, -2.0); sum += GrabPixel(i, 0.15, -1.0); sum += GrabPixel(i, 0.18, 0.0); sum += GrabPixel(i, 0.15, +1.0); sum += GrabPixel(i, 0.12, +2.0); sum += GrabPixel(i, 0.09, +3.0); sum += GrabPixel(i, 0.05, +4.0); // sum += GrabPixel(i, 0.01, -9.0); // sum += GrabPixel(i, 0.02, -8.0); // sum += GrabPixel(i, 0.03, -7.0); // sum += GrabPixel(i, 0.04, -6.0); // sum += GrabPixel(i, 0.05, -5.0); // sum += GrabPixel(i, 0.06, -4.0); // sum += GrabPixel(i, 0.07, -3.0); // sum += GrabPixel(i, 0.08, -2.0); // sum += GrabPixel(i, 0.09, -1.0); // sum += GrabPixel(i, 0.10, 0.0); // sum += GrabPixel(i, 0.09, +1.0); // sum += GrabPixel(i, 0.08, +2.0); // sum += GrabPixel(i, 0.07, +3.0); // sum += GrabPixel(i, 0.06, +4.0); // sum += GrabPixel(i, 0.05, +5.0); // sum += GrabPixel(i, 0.04, +6.0); // sum += GrabPixel(i, 0.03, +7.0); // sum += GrabPixel(i, 0.02, +8.0); // sum += GrabPixel(i, 0.01, +9.0); float4 col5 = tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(i.uvgrab)); float decayFactor = 1.0f; if (i.uvgrab.x == 0 && i.uvgrab.y == 0){ decayFactor = 0; } sum = lerp(col5, sum, decayFactor) * i.color * _Color; return sum; } ENDCG } // Vertical blur GrabPass { Tags { "LightMode" = "Always" } } Pass { Tags { "LightMode" = "Always" } Name "BackBlurVer" CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma fragmentoption ARB_precision_hint_fastest #include "UnityCG.cginc" struct appdata_t { float4 vertex : POSITION; float2 texcoord: TEXCOORD0; float4 color : COLOR; }; struct v2f { float4 vertex : POSITION; float4 uvgrab : TEXCOORD0; float4 color : COLOR; }; v2f vert (appdata_t v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); #if UNITY_UV_STARTS_AT_TOP float scale = -1.0; #else float scale = 1.0; #endif o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*scale) + o.vertex.w) * 0.5; o.uvgrab.zw = o.vertex.zw; o.color = v.color; return o; } sampler2D _GrabTexture; float4 _GrabTexture_TexelSize; float _Size; uniform float4 _Color; half4 GrabPixel(v2f i, float weight, float kernely){ if (i.uvgrab.x == 0 && i.uvgrab.y == 0){ kernely = 0; } return tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x, i.uvgrab.y + _GrabTexture_TexelSize.y*kernely*_Size, i.uvgrab.z, i.uvgrab.w))) * weight; } half4 frag( v2f i ) : COLOR { half4 sum = half4(0,0,0,0); // #define GRABPIXEL(weight,kernely) tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x, i.uvgrab.y + _GrabTexture_TexelSize.y * kernely*_Size, i.uvgrab.z, i.uvgrab.w))) * weight sum += GrabPixel(i, 0.05, -4.0); sum += GrabPixel(i, 0.09, -3.0); sum += GrabPixel(i, 0.12, -2.0); sum += GrabPixel(i, 0.15, -1.0); sum += GrabPixel(i, 0.18, 0.0); sum += GrabPixel(i, 0.15, +1.0); sum += GrabPixel(i, 0.12, +2.0); sum += GrabPixel(i, 0.09, +3.0); sum += GrabPixel(i, 0.05, +4.0); // sum += GrabPixel(i, 0.01, -9.0); // sum += GrabPixel(i, 0.02, -8.0); // sum += GrabPixel(i, 0.03, -7.0); // sum += GrabPixel(i, 0.04, -6.0); // sum += GrabPixel(i, 0.05, -5.0); // sum += GrabPixel(i, 0.06, -4.0); // sum += GrabPixel(i, 0.07, -3.0); // sum += GrabPixel(i, 0.08, -2.0); // sum += GrabPixel(i, 0.09, -1.0); // sum += GrabPixel(i, 0.10, 0.0); // sum += GrabPixel(i, 0.09, +1.0); // sum += GrabPixel(i, 0.08, +2.0); // sum += GrabPixel(i, 0.07, +3.0); // sum += GrabPixel(i, 0.06, +4.0); // sum += GrabPixel(i, 0.05, +5.0); // sum += GrabPixel(i, 0.04, +6.0); // sum += GrabPixel(i, 0.03, +7.0); // sum += GrabPixel(i, 0.02, +8.0); // sum += GrabPixel(i, 0.01, +9.0); float4 col5 = tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(i.uvgrab)); float decayFactor = 1.0f; if (i.uvgrab.x == 0 && i.uvgrab.y == 0){ decayFactor = 0; } sum = lerp(col5, sum, decayFactor) * i.color * _Color; return sum; } ENDCG } } } }
計(jì)算是一樣的,不過這個(gè)相對(duì)來說要慢,畢竟是將整個(gè)屏幕那來計(jì)算的,肯定會(huì)慢很多。用法也一樣,shader放到一個(gè)新建的材質(zhì)球上,然后將材質(zhì)球拖到一個(gè)Image組件的Material屬性欄中即可,這里你可以調(diào)整Image的寬高,這樣可以指定模糊那一塊區(qū)域了。
看效果:
然后我移動(dòng)和調(diào)整寬高之后:
當(dāng)然也可以調(diào)成整屏模糊:
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
分享題目:Unity3DUGUI特效之Image高斯模糊效果
標(biāo)題URL:http://bm7419.com/article14/pscgde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、品牌網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、網(wǎng)站策劃、品牌網(wǎng)站制作、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)