스토리지

[5.6] Light 연산 (Lambert, Half-Lambert) 본문

Unity/Shader

[5.6] Light 연산 (Lambert, Half-Lambert)

ljw4104 2021. 5. 6. 12:20

조명이 머리 위에 있을 때 / 조명이 머리 앞에 있을 때

* saturate(float a)

: 값을 0과 1 사이의 값으로 잘라줌. 0보다 작으면 0, 1보다 크면 1과 같은 방식.

float ndotl = saturate(dot(s.Normal, lightDir));      //normal벡터와 light벡터를 내적한 값. saturate: 0~1의 사이의 값으로 값을 잘라줌.

developer.download.nvidia.com/cg/saturate.html

 

saturate

Name saturate - returns smallest integer not less than a scalar or each vector component. Synopsis float saturate(float x); float1 saturate(float1 x); float2 saturate(float2 x); float3 saturate(float3 x); float4 saturate(float4 x); half saturate(half x); h

developer.download.nvidia.com

∵ 음수가 되면 예상치 못한 에러가 발생할 수 있기때문에 조명과의 각도가 90도인 지점부터 항상 0으로 바꿔버림.

 

* Half - Lambert

Half-Lambert

Half Lambert(하프 램버트) 라이팅은 Valve(밸브)가 Half-Life(하프 라이프)에서 처음 개발한 기법으로 물체 어두운 면의 형태를 잃지 않고, 너무 평평하게 보이지 않도록 하기 위해 고안됐다. 쉽게 설명하면 오브젝트의 어두운 부분을 너무 어둡지 않게 최소 0.5의 밝기로 라이팅을 넣어준다.
참고 : https://developer.valvesoftware.com/wiki/Half_Lambert

 

아래의 코드에서 _LightColor0을 없앤 결과

Shader "Custom/Test"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _BumpTex ("Albedo (RGB)", 2D) = "bump" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Test noambient
        //Unity의 내장 함수대신에 함수를 커스텀함 이름 : Test

        sampler2D _MainTex;
        sampler2D _BumpTex;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpTex;
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            fixed4 d = tex2D (_BumpTex, IN.uv_BumpTex);
            o.Albedo = c.rgb;
            o.Normal = UnpackNormal(d);
            o.Alpha = c.a;
        }

        //surf가 출력한 값을 바탕으로 계산하기에 밑에서 선언하는 편이 좋음.
        //★ 위에 정의한 것 앞에 Lighting을 꼭 붙인 다음에 선언해야한다. ★       ex) Lighting + Test.
        float4 LightingTest(SurfaceOutput s, float3 lightDir, float atten)  
        //s: 위에서 저장된 구조체, lightDir: 조명 (단위)벡터, atten: 감쇠(attenuation, 가까우면 밝아지고, 멀어지면 어두워진다.)
        {
            //조명이 가장 밝을때가 -1이기때문에 조명벡터가 뒤집혀서 들어온다.
            float ndotl = dot(s.Normal, lightDir) * 0.5 + 0.5;      //normal벡터와 light벡터를 내적한 값. Half-lambert

            float4 final;
            final.rgb = ndotl * s.Albedo * _LightColor0.rgb * atten;    //_LightColor0 : 내장 LightColor

            return ndotl;
        }

        ENDCG
    }
    FallBack "Diffuse"
}

Point Type의 Light를 사용하면 더 효과를 잘 볼 수 있다. ( 감쇠 )

Point Light를 사용

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

[5.6] Light 연산 연습  (0) 2021.05.06
[5.6] Light 연산 정리  (0) 2021.05.06
[5.6] Lightening 계산  (0) 2021.05.06
[5.4] Shader Lightening  (0) 2021.05.04
[5.4] Shader 2  (0) 2021.05.04
Comments