Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
05-16 04:51
관리 메뉴

nomad-programmer

[CG/Unity] Lambert 셰이더 본문

CG/Unity

[CG/Unity] Lambert 셰이더

scii 2022. 1. 16. 21:36
Shader "Custom/NewSurfaceShader"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _BumpMap ("Bump Map", 2D) = "bump" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Test 

        #pragma target 3.0

        sampler2D _MainTex;
        sampler2D _BumpMap;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            float4 normMap = tex2D(_BumpMap, IN.uv_BumpMap);
            float3 unpackNormMap = UnpackNormal(normMap);

            o.Albedo = c.rgb;
            o.Alpha = c.a;
            o.Normal = unpackNormMap;
        }

        float4 LightingTest(SurfaceOutput s, float3 lightDir, float atten){
            float ndotl = saturate(dot(s.Normal, lightDir));
            float4 final;
            final.rgb = ndotl * s.Albedo * _LightColor0.rgb * atten;
            final.a = s.Alpha;
            return final;
        }

        ENDCG
    }
    FallBack "Diffuse"
}

 _LightColor0.rgb : 내장 변수를 이용해서 조명의 색상과 강도를 가져옵니다. 

atten : 빛의 감쇠 현상을 시뮬레이트합니다.

만약 atten을 계산하지 않으면 다음과 같은 일이 일어나지 않습니다.

  • self-shadow가 생기지 않습니다.
  • receive shadow가 동작하지 않습니다. 다른 물체의 그림자를 드리우지 못합니다.
  • 조명의 감쇠 현상이 일어나지 않습니다. point 라이트를 넣으면 point 라이트에서 점점 멀어질수록 어두어지는데 이것이 atten에서 하는 일입니다.
noambient는 작업 과정 중간에 온전하고 순수한 색상을 확인하기 위해 적용해 놓은 것일 뿐, 이펙트처럼 환경광이 필요 없는 경우가 아니라면 작업이 끝난 후 "삭제"하는 것을 잊지 말아야 한다.

 

이것이 온잔한 Lambert 셰이더이다. 이것은 유니티 4까지 사용되었던 Bumped Diffuse와 완전히 같은 셰이더이며, 유니티 5에서도 Legacy Shaders / Bumped Diffuse와도 완전히 같은 셰이더이다.

 


Half-Lambert

Lambert 라이트는 꽤 가벼운 조명 공식임에 틀림없지만, cos 그래프 연산의 특성상 밝다가 너무 갑자기 검게 음영이 떨어지는 단점이 있다. 그래서 이 단점을 해결하고자 만든 것이 Half-Lamber 공식이다. 물리적으로는 옳지 않지만, 보기 좋기에 만들어졌다. 무엇보다 매우 가볍고 효과가 좋은 공식이라고 할 수 있다.

dot(N, L)

dot함수를 이용하여 음영이 표현했다. 그래프로 표현하면 위의 그림과 같다. 보다시피 -1 ~ 1 까지의 값을 갖는다.

dot(N, L) * 0.5 + 0.5

x * 0.5 + 0.5는 마법의 숫자이다. 이 공식은 -1 ~ 1까지의 범위를 0 ~ 1까지의 범위로 만들어 준다. 그 결과는 위의 그림과 같다. 즉 무척 부드러운 결과 값이 나온다.

물론, 실제 사용 시에는 이 음영은 너무 부드러워서 물리적으로 전혀 옳지 않게, 빛이 거의 180도까지 영향을 끼친다. 실제 사용할 때에는 이 정도를 줄이고자 결과물에 제곱을 해주곤 한다. 아래의 그림은 3을 제곱한 half-lamber의 그래프이다.

pow(dot(N, L) * 0.5 + 0.5, 3)

 

 
 
 
 

'CG > Unity' 카테고리의 다른 글

[CG/Unity] Diffuse Warping  (0) 2022.02.01
[CG/Unity] Toon Shader  (0) 2022.02.01
[CG/Unity] Vertex Shader  (0) 2022.01.30
[CG/Unity] Custom Light 만드는 방법  (0) 2022.01.15
[CG/Unity] 유니티 셰이더의 작성 방법  (0) 2021.11.14
Comments