본문 바로가기
Unity

[Unity] Lambert Shader 구현 (쉐이더 스타트업)

by 소리쿤 2023. 2. 4.

사용하는 구조체는 SurfaceOutput

 

albedo, normal, emission 이거는 standard랑 똑같이 쓰면 되고, Specular, Gloss가 다르다.

그런데 Lambert에서 넣어봤자 변화는 없으며, 다른 BlinnPhong Shader를 쓸 때 쓰는 것임

 

Lambert Shader를 구현한

CG 프로그램 코드이다.

 

CGPROGRAM
		// Lighting + Test, ambient 제거
		#pragma surface surf Test noambient

        sampler2D _MainTex;
        sampler2D _BumpTex;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpTex;
        };

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

        // 여기서 Lighting + Test이다. 위 #pragma surface surf "Test" noambient이다.
        // surf에서 out된 SurfaceOutput을 s로 넣게 된다.
        // lightDir은 조명벡터를 뒤집은 것 - 내적을 쉽게 하기 위함
        // atten은 감쇠 (조명이 거리에 따라 약해진 정도)
        float4 LightingTest(SurfaceOutput s, float3 lightDir, float atten)
        {
            float albedoHelper = dot(s.Normal, lightDir);
            albedoHelper = saturate(albedoHelper); // Clamp (0 ~ 1)
			// 받은 빛의 세기 연산

            float4 final;
            final.rgb = albedoHelper * s.Albedo * _LightColor0.rgb * atten;
            // 빛의 세기 * 물체 고유 색 * 조명의 색상 * 감쇠 
            final.a = s.Alpha;

            return final;
        }

        ENDCG

 

쉐이더 적용 전
쉐이더 적용 후

 

여기서 Half Lambert도 있는데, 이건 내적의 cos 함수 특성 상 

0으로 갈수록 급격히 떨어지기 때문에 확 어두워지는 것을 막기 위해 약간 처리를 하는 개념이다.

위 albedoHelper에 * 0.5 + 0.5 정도를 해주면 된다.

하프 쉐이더 적용 후