Posts Screen Effect - Blur
Post
Cancel

Screen Effect - Blur

Summary


  • 블러 이펙트

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


Properties


  • Resolution : 블러 적용 해상도(기본 0.5)

  • Intensity : 블러 적용 강도

  • Blur Area Mask : 블러 적용 영역을 제한할 수 있는 마스크


Preview


[1] 블러 미적용

image


[2] 블러 적용

  • Resolution : 0.5
  • Intensity : 0.4

image


[3] 마스크 사용

  • 사용된 마스크

image

  • 결과

2021_0830_ScreenEffect_Blur


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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
Shader "Rito/Screen Blur"
{
    Properties
    {
        [HideInInspector] _MainTex ("Texture", 2D) = "white" {}
        _MaskTex ("Blur Area Mask", 2D) = "white" {}
        _Resolution("Resolution", Range(0, 1)) = 0.5
        _Intensity("Intensity", 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;
            sampler2D _MaskTex; // 블러 영역 마스크
            float _Resolution;
            float _Intensity;

            #define RANDOM_SEED 426.791

            static const half2 dir[8] = 
            {
                half2(1., 0.),
                half2(-1., 0.),
                half2(0., 1.),
                half2(0., -1.),
                half2(1., 1.),
                half2(-1., 1.),
                half2(1., 1.),
                half2(1., -1.),
            };

            float2 GetRandomDir(float2 uv, uint i)
            {
                float r1 = (uv.x * uv.y);
                float r2 = ((1. - uv.x) * uv.y);
                float r3 = (uv.x * (1. - uv.y));
                float r4 = ((1. - uv.x) * (1. - uv.y));

                float r = frac((r1 + r2 + r3 + r4) * RANDOM_SEED * i);
                float2 d = dir[i % 8] * r;
                // i % 2 : 좌우
                // i % 4 : 상하좌우
                // i % 8 : 8방향

                return d;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                uint sampleCount = (uint)(_Resolution * 64.);

                fixed4 mainColor = tex2D(_MainTex, i.uv);

                if(_Intensity <= 0.0 || _Resolution <= 0.0)
                    return mainColor;

                float4 col = 0.;
                for(uint index = 0; index < sampleCount; index++)
                {
                    float2 uv = i.uv - GetRandomDir(i.uv, index) * _Intensity * 0.05;
                    col += tex2D(_MainTex, uv);
                }
                
                fixed4 mask = tex2D(_MaskTex, i.uv);

                return lerp(mainColor, (col / sampleCount), mask);
            }
            ENDCG
        }
    }
}
This post is licensed under CC BY 4.0 by the author.