본문 바로가기

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

Lambert(램버트) 라이팅 만들기

유니티 4 이전 시절에 존재하던 가벼운 라이팅 방식인 Lambert 라이팅

빛의 음영은 계산하지만, Specular는 계산하지 않는 매우 전통적이고 가벼운 라이팅 공식


현재는 Standard 라이팅 방식. 라이팅 함수에 대한 자세한 내용은 다른 곳에 정의되어 있고 그곳에는 다른 라이팅 방식(구형 라이팅 방식 포함)도 정의되어 있음. 올바른 라이팅 함수 이름만 불러 오면 램버트 라이팅 생성 가능

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
Shader "Custom/Lambert" {
    Properties{
        _MainTex("Albedo (RGB)", 2D) = "white" {}
    }
        SubShader{
        Tags{ "RenderType" = "Opaque" }
 
        CGPROGRAM
#pragma surface surf Standard
 
        sampler2D _MainTex;
 
    struct Input {
        float2 uv_MainTex;
    };
 
    void surf(Input IN, inout SurfaceOutputStandard o) {
        fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
        o.Albedo = c.rgb;
        o.Alpha = c.a;
    }
    ENDCG
    }
        FallBack "Diffuse"
}
 
cs

위와 같은 텍스쳐만 받는 쉐이더에서 


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
Shader "Custom/Lambert" {
    Properties {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        }
    SubShader {
        Tags { "RenderType"="Opaque" }
        
        CGPROGRAM
        #pragma surface surf Lambert
 
        sampler2D _MainTex;
 
        struct Input {
            float2 uv_MainTex;
        };
 
        void surf (Input IN, inout SurfaceOutput o) {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}
 
cs

위와 같이 수정해주면 Standard 라이팅 대신 Lambert 라이팅을 사용하기 때문에 라이팅 함수 이름을 바꿔주고

구조체 역시 구형 구조체 사용.

Standard                                                      Lambert


결과물만 두고 봤을 때 별로 바뀌지 않은 것 같지만 하이라이트 없이 둔탁한 느낌의 이미지가 Lambert 라이팅의 특징이기 때문. 이 라이팅 함수에서는 Emission Normal을 사용할 수 있음. Specular는 전혀 구현할 수 없으므로 o.Specular나 o.Gloss에 어떠한 값을 넣더라도 Specular는 나타나지 않음.

크게 바뀐 것 없이 느껴지더라도 이 라이팅 구조는 내장된 기본 라이팅 구조 중 가장 가벼운 것이며, 저사양의 기기에도 잘 구동됨.