最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Unity3D UGUI特效之Image高斯模糊效果

 更新時間:2021年08月08日 14:34:12   作者:蘇小敗在路上  
這篇文章主要為大家詳細介紹了Unity3D UGUI特效之Image高斯模糊效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

這幾天研究了下模糊特效,看了很多文章,其原理就是拿取圖片或屏幕數(shù)據(jù),然后將周圍的元素和目標(biāo)位置的顏色值進行一個融合計算,然后自己寫了一個小小的測試程序。

這個模糊也可以分成兩種,一個是自身模糊,一個是從屏幕上取值進行模糊。第一個用于一些小的列表展示,比如未解鎖時,是模糊的。第二個是凸顯彈框效果的,將背景都模糊掉,自己將這個稍微加強了些可以指定模糊一個位置。

針對移動平臺,使用高斯模糊,其實效率不是很高,如果要很好的效果,那么速度卡;如果要速度快,那么效果達不到要求。但是還是在這里記錄下,興許以后能用上。

先說第一個,掛在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
 }
 }
}

里面分了兩個Pass來計算,這樣算出的效果會好很多,然后里面試了跟多的計算,越多的分層,那么得到的效果也越高,也意味著更加的不流暢。將shader放到一個新建的材質(zhì)球上,然后把材質(zhì)拖到Image組件的Material屬性欄上就可以了。

看看效果:

然后說第二個方式,它是將背景都給模糊的效果。

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 
   }
  } 
 } 
}

計算是一樣的,不過這個相對來說要慢,畢竟是將整個屏幕那來計算的,肯定會慢很多。用法也一樣,shader放到一個新建的材質(zhì)球上,然后將材質(zhì)球拖到一個Image組件的Material屬性欄中即可,這里你可以調(diào)整Image的寬高,這樣可以指定模糊那一塊區(qū)域了。

看效果:

然后我移動和調(diào)整寬高之后:

當(dāng)然也可以調(diào)成整屏模糊:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#實現(xiàn)事件總線的方法示例

    C#實現(xiàn)事件總線的方法示例

    事件總線是一種用于在應(yīng)用程序內(nèi)部或跨應(yīng)用程序組件之間進行事件通信的機制,本文主要介紹了C#實現(xiàn)事件總線的方法示例,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • C#控件picturebox實現(xiàn)畫圖功能

    C#控件picturebox實現(xiàn)畫圖功能

    這篇文章主要為大家詳細介紹了C#控件picturebox實現(xiàn)畫圖功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • C#圖片上傳效果實例分析

    C#圖片上傳效果實例分析

    這篇文章主要介紹了C#圖片上傳效果實現(xiàn)方法,可實現(xiàn)圖片上傳效果預(yù)覽功能,需要的朋友可以參考下
    2015-06-06
  • c#操作Redis的5種基本類型匯總

    c#操作Redis的5種基本類型匯總

    這篇文章主要給大家介紹了關(guān)于c#操作Redis的5種基本類型,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C#中抽象類與接口的區(qū)別詳解

    C#中抽象類與接口的區(qū)別詳解

    本文主要介紹了C#中抽象類與接口的區(qū)別。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • C#實現(xiàn)將json轉(zhuǎn)換為DataTable的方法

    C#實現(xiàn)將json轉(zhuǎn)換為DataTable的方法

    這篇文章主要介紹了C#實現(xiàn)將json轉(zhuǎn)換為DataTable的方法,涉及C#操作json及DataTable的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • C#使用Dispose模式實現(xiàn)手動對資源的釋放

    C#使用Dispose模式實現(xiàn)手動對資源的釋放

    這篇文章主要介紹了C#使用Dispose模式實現(xiàn)手動對資源的釋放,涉及C#采用Dispose模式操作資源的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • C#實現(xiàn)的SQL備份與還原功能示例

    C#實現(xiàn)的SQL備份與還原功能示例

    這篇文章主要介紹了C#實現(xiàn)的SQL備份與還原功能,結(jié)合具體實例形式分析了C#操作數(shù)據(jù)庫實現(xiàn)SQL備份與還原相關(guān)的控件、SQL連接、文件等操作技巧,需要的朋友可以參考下
    2017-06-06
  • C#操作session的類實例

    C#操作session的類實例

    這篇文章主要介紹了C#操作session的類,實例分析了C#針對session的添加、讀取及刪除等技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • C#操作LINQ to SQL組件進行數(shù)據(jù)庫建模的基本教程

    C#操作LINQ to SQL組件進行數(shù)據(jù)庫建模的基本教程

    這篇文章主要介紹了C#操作LINQ to SQL組件進行數(shù)據(jù)庫建模的基本教程,LINQ to SQL被集成在.NET框架之中,需要的朋友可以參考下
    2016-03-03

最新評論

阳朔县| 崇文区| 合作市| 同江市| 北流市| 根河市| 尼勒克县| 团风县| 和硕县| 民权县| 读书| 平乡县| 新竹市| 高青县| 连城县| 南江县| 五指山市| 白沙| 郯城县| 搜索| 乐都县| 阿瓦提县| 临潭县| 平原县| 乳源| 大新县| 五台县| 西和县| 资源县| 衢州市| 和静县| 襄城县| 永春县| 新民市| 腾冲县| 紫金县| 两当县| 精河县| 乌苏市| 东宁县| 钟祥市|