본문 바로가기
SHADER

유니티 서피스 셰이더를 UnLit으로 사용할 때 캐릭터가 하얗게 타는 현상.

by tartist 2016. 7. 14.

유니티 서피스 셰이더를 UnLit으로 사용할 때 캐릭터가 하얗게 타는 현상이 발생했다.

Scene안에 라이트가 두개 이상 있을경우 UnLit 서피스 셰이더임에도 캐릭터가 하얗게 타는 것이다..(프라그 셰이더는 발생하지 않음)

해당 문제를 해결하기 위해서는 noforwardadd를 꼭 써줘야 한다.

 

 

#pragma surface surf NoLighting noambient noforwardadd

 

그런데 이렇게 하고나서도 또 타는 현상이 발생했는데, 이 역시 라이트가 두개 있을때 두 라이트가 같은 Layer Culling을 사용하면서

그 사용된 Culling Object가 또 하얗게 타는 것이다... 레이어를 수정해서 해결하긴 했는데.. 뭔가 이상하고 찜찜한 기분..

 

 

아래는 라이트에 영향받지 않는 저 사양 서피스 셰이더 코드이다. 딱 림컬러까지만 처리~

 

 

    SubShader
    {
        LOD 200
        Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
        Lighting off

            CGPROGRAM
            
            #pragma surface surf NoLighting noambient noforwardadd

            //================================================================
            // VARIABLES
            
            fixed4 _Color;
            sampler2D _MainTex;
  
            uniform fixed _IsRim;
            uniform fixed4 _RimColor;
            uniform fixed _RimPower;
   

            struct Input
            {
                half2 uv_MainTex;
                half3 viewDir;
            };
            

            half4 LightingNoLighting (SurfaceOutput s, half3 lightDir, half atten)
            {
               return half4(s.Albedo, s.Alpha);
            }
            
            
            //================================================================
            // SURFACE FUNCTION
            
            void surf (Input IN, inout SurfaceOutput o)
            {
                fixed4 mainTex = tex2D(_MainTex, IN.uv_MainTex);
                fixed rim = (1.0 - saturate(dot(normalize(IN.viewDir), o.Normal)));

                o.Albedo = mainTex.rgb; * Color.rgb;

                o.Alpha = mainTex.a * _Color.a;

                o.Emission = _RimColor.rgb * pow(rim, 1.5 - _RimPower) * _IsRim;

            }
            
            ENDCG

    }