Unity

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

소리쿤 2023. 2. 4. 15:45

사용하는 구조체는 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 정도를 해주면 된다.

하프 쉐이더 적용 후