Unity3D implementa efectos de desenfoque gaussiano (desenfoque) de lente de cámara y desenfoque gaussiano de imagen UGUI (desenfoque)

prefacio

El desenfoque gaussiano es un efecto especial de uso muy común, como la creación de profundidad de campo o vidrio esmerilado y se pueden usar otros efectos. A continuación se presenta el uso de la lente y la interfaz de usuario.

1. Efectos de lente en la cámara

Este efecto se puede lograr fácilmente mediante dos complementos de efectos especiales en la cámara. El primer complemento es el clásico ImageEffect, que se puede lograr fácilmente agregando componentes BlurOptimized debajo de la lente, y el efecto específico se puede ajustar cambiando los parámetros. El segundo complemento es PostProcess, que es una versión mejorada del primer complemento con más funciones. Después de instalar el complemento, primero agregue el componente PostProcessingBehaviour debajo de la cámara, luego haga clic con el botón derecho en el panel Proyecto para crear un PostProcess y arrástrelo al componente PostProcessingBehaviour debajo de la cámara, y luego ajuste el efecto en PostProcess. El efecto de desenfoque gaussiano es solo una pequeña parte de las funciones de estos dos complementos, y hay muchos efectos útiles, como floración, ruido, etc., que puede estudiar usted mismo.
Sin embargo, existe el problema de que es mejor usar ImageEffect en el lado móvil para ser más estable. Usé PostProcess al comienzo del proyecto para lograr el efecto, y el resultado fue una pantalla borrosa cuando se probó en un dispositivo de gama baja. máquina. Después de verificar, parece que la GPU de la máquina de gama baja no es compatible con la nueva API de sombreado. A continuación hay enlaces a ambos complementos.
1. Efecto
de imagen 2. Posproceso

2. Agregue la implementación del sombreador a la imagen en UGUI

Porque para lograr el efecto de difuminar el fondo detrás del panel de diálogo, no se puede lograr agregando efectos especiales directamente a la cámara, sino dividiendo las capas en una máscara similar. He probado muchos shaders en Internet, y el siguiente es el mejor que he probado.

Cómo usar: primero establezca la transparencia de la imagen en 0 y luego asigne el material con el sombreador a la imagen. El efecto específico se puede ajustar cambiando los parámetros en el material.

Shader "Custom/MaskedUIBlur" {
    
    
    Properties {
    
    
        _Size ("Blur", Range(0, 30)) = 1
        [HideInInspector] _MainTex ("Masking Texture", 2D) = "white" {
    
    }
        _AdditiveColor ("Additive Tint color", Color) = (0, 0, 0, 0)
        _MultiplyColor ("Multiply Tint color", Color) = (1, 1, 1, 1)
    }

    Category {
    
    

        // We must be transparent, so other objects are drawn before this one.
        Tags {
    
     "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Opaque" }


        SubShader
        {
    
    
            // Horizontal blur
            GrabPass
            {
    
    
                "_HBlur"
            }
            /*
            ZTest Off
            Blend SrcAlpha OneMinusSrcAlpha
            */

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

            Pass
            {
    
              
                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;
                };

                struct v2f {
    
    
                    float4 vertex : POSITION;
                    float4 uvgrab : TEXCOORD0;
                    float2 uvmain : TEXCOORD1;
                };

                sampler2D _MainTex;
                float4 _MainTex_ST;

                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.uvmain = TRANSFORM_TEX(v.texcoord, _MainTex);
                    return o;
                }

                sampler2D _HBlur;
                float4 _HBlur_TexelSize;
                float _Size;
                float4 _AdditiveColor;
                float4 _MultiplyColor;

                half4 frag( v2f i ) : COLOR
                {
    
       
                    half4 sum = half4(0,0,0,0);

                    #define GRABPIXEL(weight,kernelx) tex2Dproj( _HBlur, UNITY_PROJ_COORD(float4(i.uvgrab.x + _HBlur_TexelSize.x * kernelx * _Size, i.uvgrab.y, i.uvgrab.z, i.uvgrab.w))) * weight

                    sum += GRABPIXEL(0.05, -4.0);
                    sum += GRABPIXEL(0.09, -3.0);
                    sum += GRABPIXEL(0.12, -2.0);
                    sum += GRABPIXEL(0.15, -1.0);
                    sum += GRABPIXEL(0.18,  0.0);
                    sum += GRABPIXEL(0.15, +1.0);
                    sum += GRABPIXEL(0.12, +2.0);
                    sum += GRABPIXEL(0.09, +3.0);
                    sum += GRABPIXEL(0.05, +4.0);


                    half4 result = half4(sum.r * _MultiplyColor.r + _AdditiveColor.r, 
                                        sum.g * _MultiplyColor.g + _AdditiveColor.g, 
                                        sum.b * _MultiplyColor.b + _AdditiveColor.b, 
                                        tex2D(_MainTex, i.uvmain).a);
                    return result;
                }
                ENDCG
            }

            // Vertical blur
            GrabPass
            {
    
    
                "_VBlur"
            }

            Pass
            {
    
              
                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;
                };

                struct v2f {
    
    
                    float4 vertex : POSITION;
                    float4 uvgrab : TEXCOORD0;
                    float2 uvmain : TEXCOORD1;
                };

                sampler2D _MainTex;
                float4 _MainTex_ST;

                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.uvmain = TRANSFORM_TEX(v.texcoord, _MainTex);

                    return o;
                }

                sampler2D _VBlur;
                float4 _VBlur_TexelSize;
                float _Size;
                float4 _AdditiveColor;
                float4 _MultiplyColor;

                half4 frag( v2f i ) : COLOR
                {
    
    
                    half4 sum = half4(0,0,0,0);

                    #define GRABPIXEL(weight,kernely) tex2Dproj( _VBlur, UNITY_PROJ_COORD(float4(i.uvgrab.x, i.uvgrab.y + _VBlur_TexelSize.y * kernely * _Size, i.uvgrab.z, i.uvgrab.w))) * weight

                    sum += GRABPIXEL(0.05, -4.0);
                    sum += GRABPIXEL(0.09, -3.0);
                    sum += GRABPIXEL(0.12, -2.0);
                    sum += GRABPIXEL(0.15, -1.0);
                    sum += GRABPIXEL(0.18,  0.0);
                    sum += GRABPIXEL(0.15, +1.0);
                    sum += GRABPIXEL(0.12, +2.0);
                    sum += GRABPIXEL(0.09, +3.0);
                    sum += GRABPIXEL(0.05, +4.0);

                    half4 result = half4(sum.r * _MultiplyColor.r + _AdditiveColor.r, 
                                        sum.g * _MultiplyColor.g + _AdditiveColor.g, 
                                        sum.b * _MultiplyColor.b + _AdditiveColor.b, 
                                        tex2D(_MainTex, i.uvmain).a);
                    return result;
                }
                ENDCG
            }
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_39162826/article/details/102978580
Recomendado
Clasificación