Posts Screen Effect - Zoom Blur
Post
Cancel

Screen Effect - Zoom Blur

Summary


  • 화면 중심에서부터 바깥 방향으로 번져나가는 블러 이펙트

  • 스크린 이펙트 적용 애셋 : Link


Properties


  • Center Pos
    • 블러 중심 위치(벡터2)
    • 기본값 : (0.5, 0.5)
  • Sample Count
    • 블러 계산(샘플링) 횟수
    • 값이 커질수록 성능 저하
  • Blur Size
    • 블러 강도
    • 범위 : 0 ~ 100
  • Area Range
    • 블러가 적용될 범위 크기
    • 바깥에서부터 화면 중심부로 범위가 증가한다.
    • 범위 : 0 ~ 1
  • Area Smoothness
    • 블러가 적용되는 영역과 미적용 영역 사이의 부드러운 정도
    • 범위 : 0 ~ 1


Preview


2021_0831_ScreenEffect_ZoomBlur


Download



Source Code


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// 출처 : https://blog.naver.com/mnpshino/221478999495

Shader "Rito/Screen Zoom Blur"
{
    Properties
    {
        [HideInInspector] _MainTex ("Texture", 2D) = "white" {}
        _CenterPos("Center Pos", Vector) = (0.5, 0.5, 0., 0.)
        _SampleCount("Sample Count", Float) = 8
        _BlurSize("Blur Size", Range(0, 100)) = 20
        _AreaRange("Area Range", Range(0, 1)) = 0.5
        _AreaSmoothness("Area Smoothness", Range(0, 1)) = 0.5
    }
    SubShader
    {
        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            sampler2D _MainTex;
            half4 _MainTex_TexelSize;

            half2 _CenterPos;
            half _SampleCount;
            half _BlurSize;
            half _AreaRange;
            half _AreaSmoothness;

            half4 frag (v2f i) : SV_Target
            {
                half4 mainCol = tex2D(_MainTex, i.uv);

                half2 uv2 = i.uv - _CenterPos;
                half4 col = half4(0., 0., 0., 1.);

                _AreaSmoothness += 0.001;

                half range = (1. - (_AreaRange + _AreaSmoothness)) * (1. + _AreaSmoothness);
                half circleRange = smoothstep(range, range + _AreaSmoothness, length(uv2));

                for(int a = 0; a < _SampleCount; a++)
                {
                    half scale = 1. - _BlurSize * _MainTex_TexelSize * a;
                    col.rgb += tex2D(_MainTex, uv2 * scale + _CenterPos).rgb;
                }

                col.rgb /= _SampleCount;

                return lerp(mainCol, col, circleRange);
            }
            ENDCG
        }
    }
}

References


This post is licensed under CC BY 4.0 by the author.