하지만 보다 현실적으로 색감이 풍부하게 보여주기 위해서는 라이팅을 추가로 배치해 분위기를 연출해주면 좋겠다. 이번 글에서는 언리얼 엔진의 라이팅 시스템을 사용해 제작한 스테이지에 빛을 입혀보겠다.
게임 그래픽에서 현실감 있는 빛을 연출하기 위해서는, 빛이 진행하는 방향으로 물체에 부딪혀 만들어내는 직접광(Direct Light)외에도 튕겨져나가서 추가적으로 만들어내는 간접광(Indirect Light) 정보까지 감안해 화면 해상도의 픽셀 수 만큼 최종 색상을 계산해내야 한다. 이렇게 표현하는 컴퓨터 그래픽 기법을 글로벌 일루미네이션(Global Illumination)이라고 한다. 이렇게 실사와 같은 렌더링을 표현하는 컴퓨터 그래픽 기술은 발전했지만, 1초에 60장 이상의 이미지를 실시간으로 그려내는 게임에서 이 기술을 바로 사용하기에는 현재 컴퓨팅 능력에 비해 계산량이 너무 많다. 그래서 게임에 비슷한 효과를 내면서 최대한 연산을 줄이는 방법을 업계와 학계에서는 지속해서 고안하고 있다.
라이트맵(Lightmap)
글로벌 일루미네이션 구현을 위해 현재 게임 산업에서 주로(라 쓰고 거의 대부분) 사용하는 렌더링 방식은 라이트맵(Lightmap)기법이다. 라이트맵 기법이란 현재 배치된 지형 지물에 대해 빛과 그림자의 시뮬레이션을 미리 계산해 라이트맵이라는 이미지에 저장하고, 게임 실행시에 이를 불러들여 기존 재질 표면에 라이트맵 정보를 추가로 입혀주는 방식이다.
자세히보면 우리가 제작한 스테이지는 라이트맵 설정이 제대로 안되어 있어서 명암이 어색하게 나온다. 툴바에 있는 빌드 버튼을 눌러서 라이트맵을 만들어보자. 언리얼 엔진에서는 빌드를 사용해 라이트맵이 완성되면 자동으로 스테이지에 반영된다.
[그림] 라이트맵 적용 결과
언리얼에서의 라이트맵 기법은 월드 단위로 관리하기 때문에, 자세한 설정은 월드 세팅의 Lightmass 섹션에서 확인할 수 있다. ( 참고로 언리얼 엔진에서는 자체적으로 제작한 라이트맵 기술을 라이트매스(Lightmass)라고 부른다. ) 아래는 라이트매스의 간접광의 추적 횟수인 Num Indirect Lighting Bounces 옵션을 다르게 하여 적용한 결과다.
라이트맵 기술은 실행전에 미리 빛을 계산해두고 실행시에 이를 입히는 방식이기 때문에, 움직이는 물체에 대해서 적용이 불가능하다. 제작한 브러시들은 사실 고정된 물체로 언리얼 엔진이 인식하기 때문에 상관이 없다만, 나머지 스태틱 메시 액터에 대해서는 언리얼 엔진 입장에서는 이것이 움직일지 고정인지 알 수가 없다. 그래서 스태틱 메시 액터를 설정할 때에는 항상 고정인지(스태틱), 안움직이지만 속성이 변화할지(스테이셔너리), 움직일지(무버블)를 지정해 엔진에게 알려주어야 한다. 트랜스폼에서 스태틱으로 체크된 물체에 한해서 언리얼엔진은 라이트맵 계산을 수행한다. 그래서 스태틱으로 설정된 액터는 게임 실행 중에는 움직일 수 없다.
라이트맵으로 생성한 그림자는 스태틱으로 설정한 물체는 고정되어 있다는 가정으로 인해 다른 물체의 표면에까지 침범해 영향을 준다. 따라서 이미 라이트맵으로 그림자까지 생성한 물체는 움직이게 되면 아래와 같이 이상하게 표현된다.
[그림] 라이트맵으로 그림자를 생성하고, 물체를 움직인 경우
그래서 스태틱으로 설정된 물체의 배치를 변경하면 다시 라이트맵을 생성해야 하며 ( 이를 굽는다는(Bake) 표현을 쓴다. ) 스태틱 타입의 액터 설정이 변경될 때마다 언리얼 엔진은 위와 같이 라이트맵을 다시 구우라는 메시지를 우리에게 뿌린다.
[그림] 스태틱 액터를 옮겼다면 라이트맵을 다시 제작하시오!
여담이지만 브러시로 제작한 집의 경우 바닥의 그림자가 깨져보이는데, 스태틱메시와 브러시를 혼용해서 사용하는 경우 그림자가 깨지는 현상이 있다. 이 현상이 눈에 거슬리면 아래와 같이 바닥 Floor 액터를 제거하고 박스 브러시로 변경하면 해결된다.
[그림] 바닥을 브러시로 교체해 재 설정한 결과
라이트의 모빌리티
라이트맵이 모두 구워진 후에 집 안을 살펴보면 굉장히 어두컴컴해졌음을 확인할 수 있다. 이는 현재 스테이지에 존재하는 빛이 태양처럼 월드 전체적으로 한 쪽 방향으로만 입사되는 디렉셔널 라이트가 유일한데, 이 빛은 건물 벽에 막혀서 내부로 들어오지 못하기 때문이다. 집 내부를 밝히기 위해 무드등을 배치해보자. 언리얼 엔진에서 특정 영역에만 영향을 미치는 빛은 포인트라이트(Point Light)와 스팟라이트(Spot Light) 두 종류를 제공하고 있다. 배치된 두 빛은 디테일 윈도우에서 모두 색상(Color), 세기(Intensity)와 적용 범위를 설정할 수 있다.
[그림] 포인트 라이트와 스팟 라이트의 배치
포인트 라이트와 스팟 라이트를 드래그해 백치한 액터의 기본 모빌리티 값은 스테이셔너리다. 이 모빌리티 속성은 위치는 움직일 수는 없지만 빛의 속성을 실시간으로 변경이 가능한 설정이다. 영역이 겹치지 않는 범위내에서는 크게 상관이 없지만, 영역이 겹치는 경우에는 실시간으로 동시에 계산하는 양이 늘어나서 전체적으로 게임의 퍼포먼스가 떨어진다. 따라서 촘촘히 빛을 많이 사용하는 경우 모빌리티 속성을 스태틱으로 변경해 배치하는 것을 권장한다.
스카이 라이트(Sky Light)
언리얼 엔진에서 네 번째 타입으로 제공하는 빛인 스카이 라이트는 큐브맵(Cubemap)이라고 불리는 정육면체 이미지에 주위 환경 정보를 담고 이 정보를 바탕으로 월드에 빛을 입히는 방식이다. 이미지로부터 빛을 만들어내기 때문에 이 기술을 이미지 기반 라이팅(Image Based Lighting, IBL)이라고도 한다. 씬에 스카이라이트를 드래그해 배치하면 전체적으로 푸르스름하게 밝아진 것을 볼 수 있다. 이는 스카이라이트 옵션에서 현재 푸른 하늘을 가지고 있는 월드를 캡쳐해 이미지로 저장하고 이를 빛으로 시뮬레이션했기 때문이다.
[그림] 스카이라이트 배치의 전후 차이 비교. 아래쪽이 적용 후
간접광 캐시
라이트를 빌드하면 언리얼엔진은 라이트 맵 텍스쳐를 만들면서 동시에 빛의 정보를 작은 점에 담아 공간에 심어놓는다. 이를 간접광 캐시(Indirect Light Cache)라고 하는데, 이 간접광 캐시는 움직이는 물체에 빛의 정보를 전달해주는 역할을 한다. 간접광 캐시에는 정확하진 않지만 컴퓨터가 빨리 계산할 수 있는 SH(Sphererical Harmonics)라는 수학을 사용해 빛의 정보를 최소화시켜서 레벨에 배치된 각 점에 꼼꼼히 저장해둔다. 간접광 캐시는 뷰포트 내 툴바 메뉴인 [표시 > 시각화 > Volume Lighting Samples]에서 확인 가능하다.
[그림] 간접광 캐시 정보의 확인
이 외에도 언리얼 엔진에는 빛에 관련된 다양한 옵션들이 존재하지만, 이번 글에서는 기초적인 부분만 정리해보았다.
Sky Sphere의 조절
현재 레벨의 Light Source 액터와 Sky Sphere 액터 두 오브제트는 밀접하게 연관되어 있다. Light Source 액터의 Y축 회전을 사용해 빛의 방향이 평행하게 진행하도록 변경하고, Sky Sphere 액터의 티테일에 있는 SunHeight 값을 리셋시키면 Sky Sphere액터는 Light Source 액터의 회전 값을 참고해 노을이 진 것처럼 하늘의 색상을 재생성한다.
[그림] 테양의 회전 값에 따른 하늘 변화의 관찰
이렇게 변경된 하늘색은 Sky Light가 캡쳐해 붉으스름한 라이팅을 만들어준다. 디렉셔널 라이트 세기를 약하게 하면 좀 더 어둡게 만들 수 있다.
참고자료 출처: http://cafe.naver.com/unrealenginekr/13052
댓글 없음:
댓글 쓰기