언리얼 엔진 라이트 - eonlieol enjin laiteu

#3d모델링 #게임그래픽 #3D 렌더링 #언리얼엔진 #라이트맵

언리얼 엔진 라이트 - eonlieol enjin laiteu

 라이트맵이란

라이트맵이란 기본적으로 텍스쳐맵이다. 오브젝트를 비추고 있는 조명정보 (statice lighting)를 구현할 때 사용된다. 라이트맵은 모델링 프로그램에 관계없이 기본적으로 UV 에디터에서 설정하게 되는데, UV에서 2개의 채널을 나누어 하나는 텍스쳐맵, 하나는 라이트맵으로 사용하며 따로 export는 하지 않는다.

언리얼 엔진 라이트 - eonlieol enjin laiteu
채널1, 텍스쳐맵
언리얼 엔진 라이트 - eonlieol enjin laiteu
채널2, 라이트맵

라이트맵은 모든 모델링에 필수적으로 존재해야되는 것은 아니고, 주로 움직임이 없는 오브젝트(정적메쉬:static mesh)에 대해 실시간 물리기반 렌더를 위한 최적화를 목적으로 할 때 생성하게 된다.

그림자를 실시간으로 계산할 경우 매 프레임(초당 30-60프레임)마다 계산하게 되어 많은 부하가 걸리게 된다. 이를 줄이기 위해 별도의 라이트 매핑 텍스쳐를 미리 생성 후 메쉬 내부의 라이트맵 UV에 이를 덧붙여 그려줌으로써 효율적이면서도 보다 좋은 퀄리티를 구축하게 위해 사용된다. 

이러한 이유로 인해 게임그래픽 뿐만 아니라 건축에서의 아키비즈 역시 라이트맵을 필수적으로 사용하게 된다.

언리얼 엔진 라이트 - eonlieol enjin laiteu
제대로 생성된 라이트맵의 예시
언리얼 엔진 라이트 - eonlieol enjin laiteu
제대로 생성되지 않은 라이트맵의 예시

 라이트맵을 설정하는 방법 (기본)

언리얼 엔진 라이트 - eonlieol enjin laiteu
10 x 10 으로 설정된 UV창 (프로그램 : Modo)

이 때, UV의 그리드 스페이싱 (grid spacing)의 값이 언리얼 엔진4 내에서 라이트맵 해상도를 알려주게 된다. 10x10 으로 설정되어 있는 경우 10x10 텍스쳐공간 내에서 받는 라이트정보를 가진다. 따라서 10x10 은 그리 큰 텍스쳐가 아님을 알 수 있다.

언리얼 엔진 라이트 - eonlieol enjin laiteu
10x10 공간 내에서 해당 표면은 3픽셀의 라이트공간만을 가지게 됨

예를들어 10x10으로 설정된 UV 타일 내에서 가장 큰 면적을 차지하고 있는 오브젝트라 할지라도, 3x3 pixel 의 공간 안에서 받는 조명 정보만을 라이트맵으로 가지게 되는 것이다. (낮은 해상도)

언리얼 엔진 라이트 - eonlieol enjin laiteu
100 x 100 공간에서는 충분한 라이트맵 해상도를 가지게 됨

라이트맵을 생성할 때 고려해야 할 점은 퀄리티와 용량의 반비례관계이다. 적은 용량으로 높은 퀄리티를 낼 수 있는 방법이 필요하기 때문이다. 또한, 라이트맵을 지닌 자잘한 오브젝트가 많은 경우, 엔진에서는 모든 오브젝트의 라이트맵을 개별적으로 읽지 않고 하나의 큰 텍스쳐맵 해상도 내에서 해당 라이트맵의 공간을 할당하는 방식으로 작동한다.

예를들어 1024x1024 텍스쳐맵 내에서 512x512어치 라이트맵을 할당하는 경우, 라이트맵 자체의 사이즈는 크지 않지만 전체 텍스쳐맵의 절반을 차지하게 설정하는 꼴이 된다. 따라서 게임과 엔진, 전체 텍스쳐맵의 사이즈를 고려한 라이트맵의 균형잡힌 공간 할당이 중요한 포인트가 된다.

언리얼 엔진 라이트 - eonlieol enjin laiteu
부분적으로 UV를 연결해줄 필요가 있는 경우

라이트맵을 만들 때의 UV 기본적으로 개별적인 UV island로 나눠져 있어야 하지만, 위 예시에서와 같이 하나의 부드러운 연결된 면을 가지는 경우 각 면이 떨어져 있으면 절개선 부위에 유격이 생기거나 검정색 선으로 짙은 음영이 발생하게 된다. 이런 경우 UV를 하나로 연결해 줄 필요가 있다. 

언리얼 엔진 라이트 - eonlieol enjin laiteu
부분적으로도 UV를 연결해서는 안되는 경우 (ex. 모듈러 모델링 등)

UV를 하나로 연결해서는 안되는 부위 (모듈러 모델링일 경우의 연결부, 접촉부 등) 일 경우, 각 면의 UV를 나누되 체커페턴의 외곽선 내에 딱 떨어지도록 수동으로 위치시켜준다. 육안으로 봤을 때 실제로는 연결되어있지 않지만 연결이 되도록 보여야 하는 면은 수동으로 패턴 간격을 맞춰주는 것이다. 이 과정에서 에지나 버텍스를 조금씩 끌어서 이동시켜도 관계없다. 

언리얼 엔진 라이트 - eonlieol enjin laiteu
UE4 라이트맵밀도 테스트 : (좌) 바르게 설정되지 않은 라이트맵(UV나눔) / (우) 바르게 설정된 라이트맵(UV연결)

밀도테스트의 광원은 가독성이 좋은 청색광으로 설정한다.

언리얼 엔진 라이트 - eonlieol enjin laiteu
나쁜사례1) 연결이 필요한 UV를 제대로 연결해주지 않은 결과, 그림자 품질에 현저한 차이가 발생한다.

엔진 내에서 라이트맵을 밀도를 테스트 해 본 화면에서, 위 사진의 두 오브젝트 앞엔 길다란 그림자를 만드는 직육면체 오브젝트가 드리워져 있다.  두 오브젝트가 그림자를 표시하는 결과는 현저하게 차이가 난다. 이에 따라 UV 배치 방식에 따라 라이트맵의 품질이 결정됨을 알 수 있다. 이처럼 라이팅 테스트에서 문제가 생기는 경우 대부분의 문제는 UV 에디터 내에서 수작업으로 컨트롤해주면 해결된다.

언리얼 엔진 라이트 - eonlieol enjin laiteu
나쁜사례2) 겹쳐진 면을 수동으로 컨트롤해주지 않은 라이팅 결과

이와 같은 고전적인 라이트맵 베이킹은 자동으로 적용되는 실시간 GI에 비해 가볍고 정밀하다는 강점이 있다고 한다. 또한 사전에 맵베이크를 해 놓는 경우 해당 오브젝트를 제외한 동적 개체(플레이어 등)에만 개별적으로 그림자를 캐스팅하고 나머지 부분은 끄는 등 최적화와 관련된 세밀한 컨트롤이 가능해진다.

이렇게 만들어진 라이트맵은 UV 채널 2에만 할당해주면, 추가적인 Export 작업 없이 언리얼 엔진에서 자동으로 읽어오게 된다.

 라이트맵을 설정하는 규칙

(1) UV island는 0-1 공간 내에서 각각 나눠져있어야 한다.

(2) 겹쳐지는 UV가 없어야 한다 (No overlapping)

(3) 텍스쳐 bleed를 방지하기 위해 두 가지의 Padding을 적절하게 설정해야 함

  • (3-1) : UV 끼리의 Padding (3ds max에서는 0.04~0.07)
  • (3-1) : UV 공간 외곽으로부터의 Padding

(4) 해상도별 UV 체커를 만들어서 사전에 라이트맵의 정상구현여부를 확인한다

(5) 라이트맵을 테스트 할 때의 가이드= Resolution은 256x256, Padding은 4,4

(6) 엔진 내에서 라이트맵 테스트를 진행한 뒤, 유격, 줄무늬, 모서리의 짙은 검정 선 등의 문제가 발생했을 땐 모델링 프로그램으로 돌아와 UV 에디터 내에서 수작업으로 라이트맵을 수정할 필요가 있다.

(7) 라이트맵을 사용하는 UV 채널은 2로 설정한다 (Channel 1= 텍스쳐, Channel 2=라이트맵)

(8) UV에서 45도-90도 사이 각을 이루는 모서리는 연결하지 않는다.

(9) 수동으로 UV를 위치시킬 때는 Pixel Snap 등의 옵션을 켜서 UV 그리드 에 딱 떨어지는 위치에 모두 위치시킨다.

(10) 소프트웨어는 라이트맵을 잘못 구현하지 않는다. 문제가 생기는 모든 경우는 라이트맵을 만들 때 범한 오류로부터 발생한다.

 라이트맵에서 추가적으로 기억해야 할 부분 (advanced)

* 라이트와 셰도의 품질을 결정한다

* 라이트 베이크와  품질은 반비례 관계로, Lightbake 옵션을 활성화 시켰을 때 광원 맵의 일부를 사용하여 더 높은 품질의 음영처리를 요구하게 되고,  더 크고 복잡한 부분에 그림자가 더 많이 발생하게 된다. (Budget consumption and quality have an inverse relationship (low budget = high quality)

* 엔진 환경 내에서 오브젝트가 스폰될 때, 라이트맵의 사용량은 85~90% 사이에 위치하는 것이 빛 및 그림자가 적정수준의 품질 유지를 할 수 있도록 해준다.

*라이트맵은 그림자 품질의 변화가 가장 눈에 띄는 부분이다.


작성자 이온 (ion) @ ionn.tistory.com