Unity/그래픽스프로그래밍

0507 _ Lim 라이트를 커스텀 라이트로 옮기기

minquu 2021. 5. 7. 11:26
반응형

기존에 했던(블린퐁에서 스펙큘러 만들기)걸 재사용해서 

LightingTest 부분만 수정할 것이다.

 

---

디퓨즈 컬러 만들기 

 

 

            //램버트 적용
            float3 diffColor;
            float ndotl = dot(s.Normal, lightDir);
            diffColor = ndotl * s.Albedo * _LightColor0.rgb * atten;

 

 

디퓨즈 (빛 정보 감쇠까지 가지는 컬러를 만들어준다.)

 

 

스펙큘러 적용된 컬러 만들기

 

 

            //스펙큘러 적용
            float3 specColor;
            float3 H = normalize(viewDir + lightDir);
            float spec = dot(H,s.Normal);
            specColor = spec * _SpecCol.rgb;

 

 

림 컬러 적용

 

            //Rim 적용
            float3 rimColor;
            float rim = dot(viewDir, s.Normal);
            float invertRim = 1 - rim;
            rimColor = invertRim;

 

 

----

위에 세가지 컬러를 이제 섞어서 출력하면 된다.

 

Shader "Custom/Test"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _BumpMap ("NormalMap", 2D) = "bump" {}
        _SpecPow ("Specular Power", Float) = 50.0
        _SpecCol ("specular Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf _Test noambient

        sampler2D _MainTex;
        sampler2D _BumpMap;
        float _SpecPow;
        float4 _SpecCol;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };

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

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

        float4 Lighting_Test (SurfaceOutput s, float3 lightDir, float viewDir, float atten){
            float4 final;

            //램버트 적용
            float3 diffColor;
            float ndotl = dot(s.Normal, lightDir);
            diffColor = ndotl * s.Albedo;


            //스펙큘러 적용
            float3 specColor;
            float3 H = normalize(viewDir + lightDir);
            float spec = dot(H,s.Normal);
            specColor = spec * _SpecCol.rgb;

            //Rim 적용
            float3 rimColor;
            float rim = dot(viewDir, s.Normal);
            float invertRim = 1 - rim;
            rimColor = invertRim;

            final.rgb = diffColor + specColor + rimColor;
            final.a = s.Alpha;
            return final;
        }

        ENDCG
    }
    FallBack "Diffuse"
}

일단 기본적인 값을 넣고 나중에는  

 

 

            diffColor = ndotl * s.Albedo * _LightColor0.rgb * atten;

여기에 추가를 하여서 디테일을 살려준다.

 

----

 

 

Shader "Custom/Test"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _BumpMap ("NormalMap", 2D) = "bump" {}
        _SpecPow ("Specular Power", Float) = 50.0
        _SpecCol ("specular Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf _Test

        sampler2D _MainTex;
        sampler2D _BumpMap;
        float _SpecPow;
        float4 _SpecCol;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };

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

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

        float4 Lighting_Test (SurfaceOutput s, float3 lightDir, float viewDir, float atten){
            float4 final;

            //램버트 적용
            float3 diffColor;
            float ndotl = saturate(dot(s.Normal, lightDir));
            diffColor = ndotl * s.Albedo * _LightColor0.rgb * atten;


            //스펙큘러 적용
            float3 specColor;
            float3 H = normalize(viewDir + lightDir);
            float spec = dot(H,s.Normal);
            specColor = spec * _SpecCol.rgb;


            //Rim 적용
            float3 rimColor;
            float rim = dot(viewDir, s.Normal);
            float invertRim = 1 - rim;
            rimColor = pow(invertRim, 6) * 0.5;

            final.rgb = diffColor + specColor + rimColor;
            final.a = s.Alpha;
            return final;
        }

        ENDCG
    }
    FallBack "Diffuse"
}

 

좀더 세부적으로 조절 할 수 있는 값들을 넣어준다. 

 

 

 

 

노앰비언트를 꺼주고, 전체적으로 만져준다. 

 

 

 

 

 

 

반응형