본문 바로가기

Unity3D C#/유니티 쉐이더 공부

Occlusion(오클루젼)

Occulusion(오클루젼)은 Ambient Occlusion(엠비언트 오클루젼)이라고도 부르며, 구석진 부분의 추가적인 음영을 표현하는 기능을 가지고 있음.

일반적으로 환경광(Ambient Color)로 가득 차 있는 세상에서 그림자가 드리워진 부분도 사방에서 오는 환경광 정도를 받고 있는 것이 일반적. 하지만, 매우 구석져 있거나 복잡한 물체들로 가려져서 환경광도 닿지 못하는 부분은 더욱 더 어두워지는데 이 부분을 Ambient Occlusion(엠비언트 오클루젼 : 환경 차폐)라고 부름.

이 Occlusion 맵 역시 여러 가지 툴에서 추출해 낼 수 있는 텍스쳐인데, SurfaceOutput에서는 float로 값을 받고 있음

이 맵을 사용하면 구석진 부분의 음영이 강조되며, 결과물의 차이가 생김.

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
Shader "Custom/MetallicSmoothness" {
    Properties {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Metallic("Metallic", Range(0,1)) = 0
        _Smoothness("Smoothness", Range(0,1)) = 0.5
        _BumpMap("NormalMap", 2D) = "bump"{}
        _Occlusion("Occlusion", 2D) = "white" {}
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        
        CGPROGRAM
        #pragma surface surf Standard 
 
        sampler2D _MainTex;
        sampler2D _BumpMap;
        sampler2D _Occlusion;
        float _Metallic;
        float _Smoothness;
 
        struct Input {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };
 
        void surf (Input IN, inout SurfaceOutputStandard o) {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Occlusion = tex2D (_Occlusion, IN.uv_MainTex);
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
            o.Albedo = c.rgb;
            o.Metallic = _Metallic;
            o.Smoothness = _Smoothness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}
 
cs

일반적인 텍스쳐를 받아 사용하는 방법과 완전히 동일하지만, 특이하게 Occlusion 맵은 독립된 UV를 받으면 에러가 남. 반드시 _MainTex와 같은 uv를 사용해야 정상적으로 작동한다는 것 유념해야 함.