이를 달성하려면 light probe를 사용해야 하는데, 이것에 대해 리서칭 및 공부를 해서 구현해보려고 한다. (따라서 참고하는 reference들이 괴장히 많을 것으로 예상된다. Reference는 항상 글 아래에 적어둔다.)
A. Light Probe는 무엇인가?
Light probe는 bake한 lighting map의 정보를 저장하여, runtime 때 이를 동적인 물체에 전달한다. 즉, scene에 light probe를 배치한 후에 light를 bake하면 그 light probe 주변의 lighting data가 미리 저장된다. 이렇게 저장된 lighting data는 runtime 때 동적인 오브젝트에게 실시간으로 전달된다. 그 결과, 동적인 객체에 대해서도 light가 적용이 되어 자연스러운 빛이 연출된다.
Ref. 2
위 사진처럼 scene 곳곳에 여러 개의 light probe들을 배치할 수 있다.
B. Light Probe로 자연스러운 빛 연출하기.
정적인 물체와 동적인 물체의 구분
게임 플레이 중 움직이지 않는 물체들(나무, 벽)은 정적인 객체로 설정한다. 다음과 같이 해당 오브젝트의 인스펙터 창에서 다음과 같이 static 설정을 해주면 된다.
Static 왼쪽의 체크박스를 표시해주면 해당 물체는 정적인 객체가 되는 것이다.
플레이어의 같은 움직이는 물체의 경우에는 이런 설정을 해줄 필요가 없다. (동적인 물체이기 때문!)
이제, Light Probe Group을 Edit하여 scene에 전반적으로 light probe들을 배치한다.
Edit Light Probes를 누르고 아래의 네가지 버튼(Add Probe, Select All, Delete Selected, Duplicated Selected)를 통해 여러 light probe들을 배치한다. 또는 scene의 light probe를 직접 마우스로 클릭해가며 선택 후 복사해도 된다.
여기서 주의해야 할 점은, 자연스러운 빛 연출을 위해서 색이 변하는 부분이라던가 그림자가 있는 부분의 경계에 light probe를 잘 설치해줘야 한다. 예를들어, 위 사진의 바닥이 핑크와 민트색으로 나눠져 있다. 색이 변하는 경계를 사이에 두고 light probe를 배치해줘야 한다는 것이다.
Baking 하기
[Window > Rendering > Lighting]을 누르면 Lighting 창이 뜬다.
Lighting 창의 아래에 Generate Lighting을 누르면 Light가 bake된다.
왼쪽에 Auto Generate 체크박스를 표시하면 빛의 설정이 바뀔 때마다 자동으로 bake해준다.
비교해보자
Light Probe 없이 Bake한 경우
구체가 민트색 바닥 위에 있든, 핑크색 바닥 위에 있든 상관없이 구체는 동일하다.
Light Probe를 배치한 후 Bake한 경우
구체가 민트색 바닥 위에 있을 때는 구체의 아래가 푸르스름하게 변하고, 핑크색 바닥 위에 있을 때는 구체의 아래가 핑크스름(?)하게 변하는 것을 알수 있다.
즉, 이렇게 light probe를 잘 배치해주면 동적인 객체에 적용되는 lighting이 굉장히 자연스러워 진다.
C. Light Mode로 실시간 그림자 구현하기.
Bake된 light 아래에서 동적 물체의 실시간 그림자를 연출해야한다. 방법은 굉장히 간단하다. Scene에 배치된 빛(directional light, point light, ...)에는 공통적으로 mode라는 것이 존재한다. 총 세가지 모드가 있다. (Realtime, Mixed, Baked)
Realtime은 runtime에 실시간으로 빛이 적용되는 것으로 굉장히 오버헤드가 크다.
Baked는 runtime 이전에 미리 lighting data를 저장해놓기 때문에 runtime때는 정적인 물체에 대해서만 빛이 적용되어 정적인 물체의 그림자만 연출된다. 즉, 동적인 물체에 대해서는 빛이 적용되지 않으므로 그림자가 생기지 않는다.
Mixed는 정적인 물체에는 저장된 lighting data에 따라 그림자가 형성되고, 동적인 물체에 대해서는 runtime 때 실시간으로 그림자가 생기게 해준다.
따라서, 플레이어와 같이 게임 내에 움직이는 동적인 객체에 대해 실시간 그림자를 연출하면서도 오버헤드를 줄이고 싶으면, light mode를 Mixed로 설정해주면 된다.
Light Mode가 Baked일 때 vs. Light Mode가 Mixed일 때
위에서 보이듯이 Baked일 때는 정적인 물체(벽)에 대해서만 그림자가 생기고, Mixed일 때는 정적인 물체와 동적인 물체(구)에 대해서 모두 그림자가 생기는 것을 알 수 있다.