주의 : 잘못된 내용이 포함되어 있을 수 있으므로 이상하면 참고자료를 참조하세요.


[ PRB 이란 무엇인가 ] 13. UE4 GI : Lightmass & Mobility

개요

UE4 에서는 공식적으로는 Dynamic GI 를 지원하지 않습니다. LightPropagationVolume( LPV ) 이 있기는 하지만, 아직도 experimental 로 분류됩니다. 그러므로 여기에서는 다루지 않도록 하겠습니다. 그리고 이 문서는 Mobility 의 차이를 설명하는 데 중점을 두고 작성되었으므로 Lightmass 사용법이나 구현에 대해서는 다루지 않겠습니다.

UE4 를 처음 접하는 분들이 가장 헷갈려하는 개념이 Mobility 입니다; Static, Stationary, Movable.

기본적으로 Mobility 라는 것은 개체가 게임 실행중에 움직이냐 그렇지 않느냐를 의미합니다. 그렇다면 솔직히 Static 과 Dynamic 만 존재해도 됩니다. 하지만 UE4 는 굳이 Stationary 와 Movable 이라는 개념을 추가했습니다. 이렇게 구분한 이유는, 각 Mobility 마다 GI 처리 방식이 다르기 때문입니다.

그림1. UE4 Mobility.

[ Global Illumination & Indirect Lighting ] 에서는 GI 에서는 빛을 크게 direct lighting( 직접광 ) 과 Indirect lighting( 간접광 )으로 나눈다고 했습니다. 단순하게 표현하면 표면에 닿은 빛이 바로 눈에 들어 오면 direct lighting 이고, 그것이 다른 곳에 반사해서 눈에 들어 오면 indirect lighting 입니다( 눈으로 바로 들어 오는 빛도 direct lighting 이라 할 수 있겠죠. 사실 scattering 을 거쳐서 들어 오기는 하지만 여기에서는 무시하도록 하겠습니다 ).

그림2. Direct lighting( 붉은색 ) 과 Indirect lighting( 녹색 ).

자! 본론으로 돌아와, 이제 각 Mobility 설정에서 GI 가 어떤 식으로 처리되는지 알아 보도록 합시다.

씬 구성

아무것도 배치되지 않은 씬에다가 바닥( Static )과 6 개의 박스( 3 개는 Static, 3 개는 Stationary, 3 개는 Movable ), 그리고 3 개의 라이트( R 은 Movable, G 는 Stationary, B 는 Static )를 배치합니다. 그리고 그 주변에 "Lightmass Importance Volume" 을 적절히 설정해 줍니다. 최종 품질을 반영하기 위해서 Production 으로 빌드합니다. 오브젝트의 재질은 모두 color=white, metalic=0.2, roughness=0.5 로 설정했습니다.

그림3. 씬구성. 바닥과 왼쪽 열은 static, 중간 열은 stationary, 오른쪽 열은 movable. 붉은색 광원은 movable, 녹색 광원은 stationary, 파란색 광원은 static.

Object Moblity

여기에서 먼저 확인해 볼 것은 오브젝트의 mobility 입니다. 이를 명확히 확인하기 위해서는 라이트맵을 살펴 보는 것이 좋습니다. 뷰포트에서 "Optimiztion Viewmodes >> Lightmap Density" 를 선택하시면 라이트맵 밀도를 볼 수가 있습니다.

그림4. 라이트맵 밀도.

그림4 를 통해 여러분이 알 수 있는 것은 오브젝트가 static 이 아니라면 라이트맵을 가지지 않는다는 것입니다. 이게 무슨 말인가 하면 stationary/movable 오브젝트는 indirect lighting 성분을 indirect lighting cache 에서 가지고 온다는 것입니다.

확인을 위해서 뷰포트에서 "Lighting Features >> Indirect Lighting Cache" 를 off 합니다.

그림5. Indirect Lighting Cacahe 메뉴.

그러면 그림6 과 같이 stationary/movable 오브젝트에서 indirect 성분이 배제되는 것을 확인할 수 있습니다.

그림6. Indirect Lighting Cache 를 off 하면 Stationary/Movable 오브젝트의 Indirect 성분이 없어짐.

Light Mobility

이제 라이트의 mobiltiy 를 살펴 보도록 하겠습니다. 일단 다시 Indirect Lighting Cache 를 on 합니다.

Static Light

Static 라이트는 Direct Lighting, Direct Shadowing, Indirect Lighting 성분을 모두 Lightmap 과 Indirect Lighting Cache 에 저장합니다.

뷰포트에서 "Lighting Components" 항목으로 간 다음 서브메뉴에서 "Dynamic Shadows", "Glboal Illumination" 을 모두 off 합니다.

그림7. Dynamic Shadows 와 Global Illumination 을 off.

그러면 그림8 처럼 Direct lighting 성분만 남습니다.

그림8. Direct Lighting 만 남겨 둠.

여기서 특이한 점을 발견하실 수 있습니다. Static 오브젝트에 Static 라이트는 반영되지 않고 그림자는 반영된다는 것입니다. 즉 Static 오브젝트의 그림자는 Direct 성분이라는 거죠.

그럼 이제는 반대로 "Glboal Illumination" 을 on 하고 "Direct Lighting" 을 off 합니다. 그러면 그림9 처럼 Indirect Lighting 성분만 남습니다.

그림9. Indirect Lighting 만 남겨 둠.

여기에서 알 수 있는 사실은 무엇입니까? Static 라이트의 direct/indirect lighting 성분은 모두 indirect lighting 으로 취급된다는 것입니다.

UE4 에서 이렇게 처리하는 이유는 무엇일까요? Lightmass 를 빌드하고 게임에 들어 가면 게임에서는 Static 라이트가 생성되지 않습니다. 그러므로 Static 라이트에 의한 direct 및 indirect 성분을 모두 indirect 로 취급하는 거죠. 이를 direct 와 indirect 로 구분하기 위해서는 라이트맵이 두 장씩 필요하고 direct lighting cache 같은 걸 만들어야겠죠. 개념적으로는 올바르지만 최적화 관점에서는 쓸데없는 짓입니다.

그래서 "LIGHTING NEEDS TO BE REBUILT" 라는 것이 나오면 성능이 저하됩니다.

왜냐! Lightmass 에서 Static 라이트와 Static 오브젝트가 빌드되기 전에는 Shadow 를 실시간 계산하고 Indirect 성분을 Indirect Lighting Cache 에서 가지고 오기 때문입니다.

Stationary Light

Stationary Light 는 Indirect Lighting 성분은 Lightmap 맵과 Indirect Lighting Cache 에 저장하고 Direct Shadowing 성분은 ShadowMap 에 저장하고 Direct Lighting 성분은 실시간에 계산합니다. 여기서 헷갈리지 말아야 할 것은, 대상 오브젝트가 static 이 아니라면( 라이트맵을 가지지 않는다면 ) direct shadowing 은 실시간에 계산된다는 것입니다.

Static 과 결정적인 차이는 Direct Lighting 성분을 실시간에 계산한다는 점인데, 이 때문에 specular reflection 처리가 가능합니다.

그림10. Specular reflection. R 은 Movable, G 는 Stationary, B 는 Static.

그림10 을 보면 Static 라이트에 대한 specular reflection 이 생기지 않는다는 것을 알 수 있습니다. 왜냐하면 diffuse 같이 뷰에 독립적인( view independent ) 성분은 어디에서 봐도 동일한 결과를 내기 때문에 미리 계산하는 것이 가능하지만, specular 와 같이 뷰에 종속적인( view dependent ) 성분들은 보는 위치에 따라 결과가 달라지기 때문에 미리 계산할 수가 없습니다.( 그림11 참조 ).

그림11. Diffuse 분산과 Specular 분산. Diffuse 는 모든 방향으로 동일하게 분산되지만, Specular 는 방향성을 가집니다.

물론 밸브( Valve )의 RNM( Radiosity Normal Map ) 라이트맵처럼 세 개의 기저벡터를 사용해서 라이트맵을 구우면 specular 를 표현할 수 있기는 하지만[2], 기저벡터마다 라이트맵을 만들어야 하므로 용량의 압박때문에 잘 사용하지는 않습니다. 

Movable Light

Movable 라이트는 Direct lighting 성분만을 가집니다. 실시간 GI 알고리즘을 사용하지 않는다면 Indirect 성분은 없습니다. Light Propagation Volume 을 사용한다면 라이트의 "Dynamic Indirect Lighting" 속성을 on 시켜 indirect 성분을 처리할 수 있습니다.

Movable 라이트는 GI 처리를 하지 않기 때문에 품질이 떨어진다는 단점을 가지고 있기는 하지만, 라이트를 움직일 수 있다는 장점이 있으므로 제한적으로 사용됩니다.

결론

지금까지 언급했던 것들을 정리하면 다음과 같습니다. 물론 HQ 라이트맵에서의 조건입니다. LQ 에서는 모든 것을 라이트맵에 넣습니다. "Indirect Lighting Cache" 는 "ILC" 라는 머리글자로 표기하도록 하겠습니다.

 

 Static Light

 Stationary Light 

 Movable Light

 Static Object

 Direct Lighting : Ligthmap.

 Direct Shadowing : ShadowMap.

 Indirect Lighting : Lightmap.

 Direct Lighting : Realtime.

 Direct Shadowing : ShadowMap.

 Indirect Lighting : Lightmap.

 Direct Lighitng : Realtime.

 Direct Shadowing : Realtime.

 Indirect Lighting : None.

 Staionary Object

 Direct Lighting : ILC.

 Direct Shadowing : None.

 Indirect Lighting : ILC.

 Direct Lighting : Realtime.

 Direct Shadowing : Realtime.

 Indirect Lighting : ILC.

 Direct Lighitng : Realtime.

 Direct Shadowing : Realtime.

 Indirect Lighting : None.

 Movable Object

 Direct Lighting : ILC.

 Direct Shadowing : None.

 Indirect Lighting : ILC.

 Direct Lighting : Realtime.

 Direct Shadowing : Realtime.

 Indirect Lighting : ILC.

 Direct Lighitng : Realtime.

 Direct Shadowing : Realtime.

 Indirect Lighting : None.

참고자료

[1] 간접광 캐시, 언리얼 문서.

[2] Half-Life(R) 2 / Valve Source(TM) Shading, GDC2004.

 

+ Recent posts