
Movable Lights (무버블 라이트)는 완벽히 동적인 빛과 그림자를 드리우며, 위치나 방향, 색, 밝기, 감쇠, 반경 등 그 모든 프로퍼티를 변경할 수 있습니다. 여기서 나오는 라이트는 라이트 맵에 구워넣지 않으며, 현재 간접광을 받을 수 없습니다.
섀도잉
그림자를 드리우도록 설정된 무버블 라이트는 전체 씬 다이내믹 섀도를 사용하기에 퍼포먼스 비용이 엄청납니다. 퍼포먼스에 가장 큰 영향을 끼치는 부분은 라이트에 영향받는 메시의 갯수와, 해당 메시의 트라이앵글 수 입니다. 즉 커다란 반경에 그림자를 드리우는 무버블 라이트는 반경이 작은 무버블 라이트보다 비용이 몇 배가 될 수 있다는 뜻입니다.
사용법
어느 라이트든지 Transform (트랜스폼) 카테고리 아래 보면 Mobility (모빌리티) 이라는 풀다운 프로퍼티가 있습니다. 이 옵션을 Movable (무버블)로 바꿉니다. 이 프로퍼티는 블루프린트에 추가된 라이트 컴포넌트에도 나타납니다.

섀도 맵 캐시
포인트 / 스포트 라이트가 움직이지 않을 때, 그 라이트에 대한 섀도 맵을 저장한 뒤 다음 프레임에 재사용할 수 있습니다. 그러면 배경이 잘 움직이지 않는 게임에서 무버블 포인트 / 스포트 라이트의 그림자 비용을 크게 줄일 수 있습니다. 여기서는 언리얼 엔진 4 (UE4) 프로젝트에서 그 기능을 사용하는 방법을 알아보겠습니다.
섀도 맵 캐시 & 퍼포먼스
Shadow Map Caching (섀도 맵 캐시) 기능은 어느 UE4 프로젝트에서든 자동 활성화 가능합니다. 섀도 맵 캐시를 사용했을 때의 퍼포먼스를 확인해 보려면, 다음과 같은 방법으로 섀도 맵 캐시 기능을 껐다켰다 하면 됩니다:
다음 섀도 맵 캐시 데모에서는 Sun Temple 프로젝트가 사용되었습니다. 에픽 게임스 런처의 학습 탭에서 이 맵을 받으실 수 있습니다.
-
프로젝트의 레벨에서 다이내믹 섀도를 드리우도록 하고픈 라이트를 전부 선택합니다.
-
라이트의 모빌리티 를 무버블 로 설정하고 그림자 드리우기 옵션이 켜졌는지 확인합니다.
-
물결표 (`) 키를 눌러 콘솔 창을 열고
Stat Shadowrendering
이라 입력하면 현재 다이내믹 섀도 비용을 볼 수 있습니다. -
다시 물결표 (`) 키를 눌러 콘솔 창을 열고
r.Shadow.CacheWholeSceneShadows 0
이라 입력하여 다이내믹 섀도 캐시 기능을 끕니다.CallCount 와 InclusiveAug 부분의 숫자를 유심히 봐주세요.
-
이제 물결표 키를 한 번 더 눌러 콘솔 창을 열고
r.Shadow.CacheWholeSceneShadows 1
이라 입력하여 섀도 캐시 기능을 다시 켭니다. CallCount 와 InclusiveAug 숫자를 비교해 보면 이 기능이 다이내믹 섀도 퍼포먼스에 끼치는 영향을 확인할 수 있습니다.
퍼포먼스
섀도 맵 캐시 기능은 퍼포먼스에 엄청난 영향을 끼칩니다. NVIDIA 970 GTX GPU 에서 1920x1200 해상도로 이 최적화를 테스트해 본 결과는 다음과 같습니다.
-
이 기능을 켜기 전, 그림자를 드리우는 포인트 라이트가 셋 있는 환경에서 캐시가 없는 경우 섀도 뎁스를 렌더링하는 데 걸린 시간은 14.89ms 입니다.
-
Cached Shadow Maps (섀도 맵 캐시) 기능을 켠 상태에서, 똑같은 렌더링 작업에 걸린 시간은 .9ms, 약 16 배 빠른 것입니다!
참고로 포인트 라이트 33 개의 기여 부분을 렌더링하는 데는 여전히 2ms 가 걸리는데, 이 부분은 다른 식으로 최적화시킬 수는 있지만 이러한 변화에는 영향받지 않습니다.
-
섀도 맵 캐시에 사용되는 최대 메모리 양은 r.Shadow.WholeSceneShadowCacheMb 로 조절할 수 있습니다.
한계
섀도 맵 캐시 기능이 UE4 프로젝트의 다이내믹 섀도 비용을 낮춰주기는 하지만, 지원되지 않는 기능과 함께 썼을 때 렌더링 부작용을 일으키게 되는 한계점이 몇 가지 있습니다. 여기서는 섀도 맵 캐시의 한계는 무엇이고 그와 관련해서 무엇을 할 수 있는지 알아보겠습니다.
-
기본적으로 오브젝트가 다음 요건을 충족했을 때만 캐시가 가능합니다:
- 프리미티브의 모빌리티 가 스태틱 또는 스테이셔너리 여야 합니다.
- 레벨에 사용되는 머티리얼이 World Position Offset 을 사용하지 않아야 합니다.
- 라이트는 포인트 또는 스포트 라이트여야 하고, 그 모빌리티 는 무버블 로 설정되어 있으며, 그림자 드리우기 옵션이 켜져 있어야 합니다.
- 라이트가 한 곳에 있어야 합니다.
- 애니메이팅 Tessellation 또는 Pixel Depth Offset 을 사용하는 머티리얼은 그림자의 뎁스를 캐시에 저장할 때 부작용이 생길 수 있습니다.