게임 그래픽 프로그래밍

셰이더: 림 라이트

101won 2024. 9. 4. 22:30

Rim라이트: 역광이있을때털이나반투명재질
라이팅, 노멀, 카메라

Fresnel (프레넬, 반사공식) :배경과 캐릭터의 분리, 강조 등 특정 상태를 표현하기 위한 이펙트 
N dot V : 뷰=카메라를 마주보고 바라보는 방향이 가장 밝음

 

        // 림 라이트 : 프레넬 만들기 ndotv
        float ndotv = dot(s.Normal, viewDir);
        return pow(1-ndotv,5);

 

Shader "Custom/Fresnel"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _RimColor ("Rim Color", Color) = (1,1,1,1)
        _RimPow ("Rim Power", Range(1, 10)) = 3
        _BumpMap("NormalMap", 2D) = "bump" {} // 노말을 적용할 범프맵
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        CGPROGRAM
        #pragma surface surf Lambert// noambient!
        #pragma target 3.0

        sampler2D _MainTex;
        sampler2D _BumpMap;
        
        float4 _RimColor;
        float _RimPow;


        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
            float3 viewDir; // 카메라로 본다
        };

         void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);

           o.Albedo = c.rgb;

         //normal map 
         fixed4 d = tex2D(_BumpMap, IN.uv_BumpMap);
         float3 normal = UnpackNormal(d);
         o.Normal = normal;
         
         
         //림 라이트 : 배경과 구분, 상태 표시
         // staturate(값):0보다 낮은 값은 0으로//1보다 높은 값은 1로 잘라준다
         // 내적연산한값은1 ~ -1
         float rim = saturate(dot(o.Normal, IN.viewDir)); 
         o.Emission = pow(1 - rim, _RimPow) * _RimColor.rgb;
         o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}