11/27

이우석·2023년 11월 27일
0

SBS 국기수업

목록 보기
75/120

쉐이더 LimLight

다양하게 사용되는 라이팅 기법 중 하나로, 역광기법이라고 할 수 있다.
찍으려는 물체의 맞은 편의 역광이 비추면 피사체가 어둡게 보이는데, 이때 외곽선이 두드러지게 보이게 된다. LimLight를 이용하면 후광 효과 및 다양한 효과를 만들어낼 수 있다.

실습

viewDir 를 Input에 넣으면 카메라 방향 정보를 받아올 수 있다.


법선 벡터와 카메라 방향을 내적한 값을 Emission에 넣으면 카메라 방향으로 빛을 쏜 듯한 효과를 낼 수 있다.


그 값을 1에서 뺀 값을 넣으면 역광 효과를 낼 수 있다.


역광을 이용한 후광 효과 (스탠다드, 커스텀, 커스텀 블린)

Shader "Apply/CustomBinnPhong"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _BumpTex("Normal Map", 2D) = "bump" {}
        _LimColor("Lim Color", Color) = (1, 1, 1, 1)
        _LimPow("Lim Intensity", Range(1, 10)) = 3
        _SpecularColor("Specular Color", Color) = (1, 1, 1, 1)
        _Specular("Specular", Range(1, 10)) = 3
        _Gloss("Gloss", Range(1, 10)) = 3
    }
    
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf CustomBlinnPhong noambient
        #pragma target 3.0

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpTex;
        };

        sampler2D _MainTex;
        sampler2D _BumpTex;

        fixed4 _LimColor;
        float _LimPow;

        float _Specular;
        fixed4 _SpecularColor;
        fixed _Gloss;

        UNITY_INSTANCING_BUFFER_START(Props)
        UNITY_INSTANCING_BUFFER_END(Props)

        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 mainTex = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = mainTex.rgb;
            o.Alpha = mainTex.a;

            fixed3 bumpTex = UnpackNormal(tex2D(_BumpTex, IN.uv_BumpTex));
            o.Normal = bumpTex.rgb;
            o.Gloss = _Gloss;
        }

        float4 LightingCustomBlinnPhong(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten)
        {
            //Lambert
            float fNDotL = saturate(dot(s.Normal, lightDir)) * 0.5 +0.5;

            // Disffuse
            float3 diffColor;
            diffColor = s.Albedo * fNDotL * _LightColor0.rgb * atten;

            // Specular
            float3 halfVector = normalize(viewDir + lightDir); //하프 벡터
            float specular = saturate(dot(s.Normal, halfVector)); // 스펙큘라 (그레이 스케일)
            specular = pow(specular, _Specular);
            float3 specularColor = specular * _LightColor0.rgb * _SpecularColor.rgb * s.Gloss;

            // Lim
            float lim = pow(1 - dot(s.Normal, viewDir), _LimPow);
            float3 limColor = _LimColor.rgb * lim;

            float4 result;
            result.rgb = diffColor + specularColor + limColor;
            result.a = s.Alpha;

            return result;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

Lim을 이용한 홀로그램 효과

Shader "Apply/CustomHoloShader"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _BumpTex("Normal Map", 2D) = "bump" {}
        _LimColor("LimLightColor", Color) = (1, 1, 1, 1)
        _LimPow("LimLight Intencity", Range(1, 10)) = 3
        _SpecularColor("Specular Color", Color) = (1, 1, 1, 1)
        _Specular("Specular", Range(1, 10)) = 3
        _Gloss("Gloss", Range(1, 10)) = 3
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue"="Transparent"}
        LOD 200

        CGPROGRAM
        #pragma surface surf CustomHolo alpha:fade
        #pragma target 3.0

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpTex;
        };

        sampler2D _MainTex;
        sampler2D _BumpTex;

        fixed4 _LimColor;
        float _LimPow;

        float _Specular;
        fixed4 _SpecularColor;
        fixed _Gloss;

        UNITY_INSTANCING_BUFFER_START(Props)
        UNITY_INSTANCING_BUFFER_END(Props)

        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 mainTex = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = mainTex.rgb;
            o.Alpha = mainTex.a;

            fixed3 bumpTex = UnpackNormal(tex2D(_BumpTex, IN.uv_BumpTex));
            o.Normal = bumpTex.rgb;
            o.Gloss = _Gloss;
        }

        float4 LightingCustomHolo(SurfaceOutput s, float lightDir, float viewDir, float atten)
        {
            // Lambert
            float nDotL = dot(s.Normal, lightDir);

            // Diffuse
            float3 diffColor;
            diffColor = s.Albedo * nDotL * _LightColor0.rgb * atten;

            // Specular
            float3 halfVector = normalize(viewDir + lightDir); //하프 벡터
            float specular = saturate(dot(s.Normal, halfVector)); // 스펙큘라 (그레이 스케일)
            specular = pow(specular, _Specular);
            float3 specularColor = specular * _LightColor0.rgb * _SpecularColor.rgb * s.Gloss;

            // Lim
            float lim = 1 - dot(s.Normal, viewDir);
            float3 limColor = pow(lim, _LimPow);

            // result
            float4 result;
            result.rgb = saturate(diffColor + specularColor + limColor);
            result.a = lim;

            return result;
        }
        ENDCG
    }
    FallBack "Diffuse"
}
profile
게임 개발자 지망생, 유니티 공부중!

0개의 댓글