본문으로 바로가기

Unity 5.6 Lightmap Mixed Lighting Menu

category Technical Report/Tutorials 2017. 6. 21. 15:05
반응형



필드에 빛을 입히다 3.0에서 리뷰를 할려고 했는데, 우선 5.6에서 변경된 라이트맵 시스템만 간략하게 리뷰하기로 한다.(3.0 탈고할때쯤이면 Enlighten이 유니티에서 없어져 버릴수도 있으니....ㅎ)



유니티 5.6에서 생긴 Mixed Lighting 모드는 총 네가지 모드를 지원한다. 우선 유니티 공식 리뷰는 아래 URL을 참고

https://blogs.unity3d.com/kr/2017/03/31/5-6-is-now-available-and-completes-the-unity-5-cycle/





Test Scene은 Western village(만들어두고 참 잘써먹는듯..)


Unlit Diffuse 상태에서 맵을 bake하게 되면

DrawCall : 26, Tri : 38,3K, Verts : 63.4K, SetPass call : 7, LightProbe는 Scene 가운데 배치

오브젝트는 총 39개인데 화면에 그려지는 stat이 위와 같다. Lightmap Texture는 1024 3장.



1. Baked Indirect

Light를 Baked로 설정하고 Bake하게 되면 기존과 동일한 결과를 확인할 수 있다. 하지만 Bake indirect는 말그대로 Indirect Light만을 Bake하기위해  사용되는 것으로 mixed 모드로 Bake하게 되면 위와 같이 Bake 된 결과를 보여준다.(Direct Light를 제외한 Indirect 만을 반영한 결과)

현재 Shader는 Unlit 기반의 Shader이므로 이를 Lambert 같은 조명계산을 반영하는 Shader로 변경해주면

이렇게 조명+GI가 반영된 결과를 확인할 수 있다(DrawCall도 당연히 늘어난다)



동적 오브젝트가 추가되면 forward render이므로 당연히 그만큼 drawcall이 늘어난다.

Static엔 Lightmap을 사용하고 부가적으로 동적 라이트 표현이 가능하다고는 하는데..... 글쎄...

야간씬에 GI와 간접광만으로 분위기 연출할때 쓸만할려나.....




2. Distance ShadowMask

DistanceShadow Mask 모드로 Bake 할때는 Lighting 옵션이 Bake로 되어있다면 Light값이 라이트맵 텍스쳐에 반영되지 않는다.(GI만 반영된 결과로 bake) Light Mode를 Mixed로 설정해서 bake 해준다.


Lightmap texture를 확인해보면 GI를 Bake한 Texture와 Light를 Bake한 Texture 두장이 생성된 것을 볼 수 있다. 이 texture가 Shadow Mask로 사용되며 이를 사용하려면 Custom Shader에서 Lighting이 Standard나 Lambert로 정의된 Shader를 사용하면 된다.


Distance ShadowMask는 가까운 곳은 Realtime으로, 먼곳은 Lightmap을 사용해서 그리게 된다.(이전 버젼의 Dual Lightmap과 비슷해 보인다.)  이미지의 그림자가 뿌옇게 흐려진 곳이 거리에 따라 실시간이 아닌 Baked된 그림자로 그리고 있는것을 확인 할 수 있다.

Drawcall은 Realtime으로 캐스팅 되므로 2배 늘어난것을 확인 할 수 있다.



그림자가 캐스팅 되는 거리는 Quality Setting의 Shadow 항목에서 제어된다.(지금 오브젝트 스케일이 작아서 5로 설정된 것임)


현재 오브젝트가 저 거리를 벗어나면 동적인 오브젝트는 그림자를 그리지 않게 된다.


가까운 거리는 실시간으로 그림자를 그리기 때문에 그림자의 품질이 매우 깔끔하게 나온다.


    half4 LightingCustomLambert (SurfaceOutput s, half3 lightDir, half atten) {
        

         fixed NdotL = dot(s.Normal, lightDir);

         fixed4 c;

         c.rgb = s.Albedo * _LightColor0.rgb * NdotL * atten;
                        
         c.a = s.Alpha;
         return c;
        
         }

Custom Light를 사용할때 전처리된 조명 명령어인 Lambert 나 Standard의 경우 내부에서 Shadow mask를 처리하지만 cutomLighting을 사용할 경우에는 ShadowMask를 사용할 수 없다.(사용하는 변수가 따로 정의되어 있는것 같은데 찾는중...) unity_lightmap 같이 방법이 있을듯~



3. Shadowmask

역시 DitanceShadow과 동일하게 ShadowMask맵이 생성된다. 차이가 있다면 거리에 상관없이 Lightmap의 texture로 그림자가 그려지는것.(그래서 Drawcall이 Distance ShadowMask 맵 방식보다 적은 수를 사용한다.)


baked 텍스쳐를 사용하지만 오브젝트 그림자와 Static mesh 그림자가 중첩되는 것도 자연스럽게 처리된다. 여기에서 Light의 Rotation값을 변경하면 Static 메쉬는 오브젝트의 색에는 영향을 미치지만 그림자는 당연히(!) 아무런 영향을 주지 못한다. 대신 동적오브젝트는 그림자 방향에 영향을 미친다.


또한, Baked에 사용된 Light가 아닌 다른 Light를 사용하게 되면 baked texture가 반영되지 않는다.



DistanceShadowMask와 ShadowMask 방식 비교


DistanceShadowMask와 ShadowMask 방식은 트리거에 다음 스크립트만 추가하면 간단하게 전환이 가능하다.


void OnTriggerEnter(Collider other)

 {

   if(QualitySettings.shadowmaskMode == ShadowmaskMode.Shadowmask)

    {

        QualitySettings.shadowmaskMode == ShadowmaskMode.DistanceShadowmask;

   }

 else

  {

      QualitySettings.shadowmaskMode == shadowmaskMode.Shadowmask;

   }

}




4. Subtractive


기존에 사용되는 Lightmap bake 모드. Indirect, Direct Light 모두 반영된다.


Shadow를 받게되면 Drawcall은 역시 증가. 이를 줄이기 위해 바닥면만 그림자를 받게 하는 방법도 있다(모바일 권장)




5. Directional Lightmapping 비교

- GLES 3.0부터 지원함.

Subtractive mode에서 directional lightmapping


Bake Indirect 에서 Directonal Lightmapping. 제대로 안나온다.




반응형