Unity 검색

공유

Is this article helpful for you?

Thank you for your feedback!

조명은 게임에서 중요한 시각적 요소 중 하나입니다. 유니티의 파트너사 ARM에서 모바일 게임 조명 최적화 위한 유용한 팁을 제공해 주었습니다.

모바일 게임을 렌더링할 때 성능 면에서 고려해야 하는 중요한 요소 중 하나는 조명입니다. 또한 시각적 스타일을 완성하는 데도 조명은 매우 중요한 요소입니다. 그러나 구현하고자 하는 시각적 품질과 성능 요구사항을 모두 충족하기 어려운 경우가 많습니다.

다행히 모바일 하드웨어의 제약 조건 안에서 둘 간의 격차를 줄이며 작업할 수 있는 방법이 있습니다. 세계 최대 모바일 칩 설계 기업인 ARM에서 실제로 활용한 모범 사례를 통해 조명 기법에 대한 팁을 공유합니다.

렌더링 파이프라인

Unity의 빌트인 렌더 파이프라인에서 Forward Rendering과 Deferred Shading이라는 두 개의 렌더링 경로를 선택할 수 있습니다. 포워드 렌더링에서 실시간 조명은 매우 비싸지만, 이 비용을 축소하기 위해 픽셀당 렌더링될 조명 수를 선택할 수 있습니다. 디퍼드 셰이딩은 GPU 기반으로, 사용 가능한 하드웨어라면 대량의 실시간 조명을 렌더링하고 높은 수준의 라이팅 정확도를 구현할 수 있습니다.

한편 디퍼드 셰이딩은 PC나 콘솔 등의 조명 집약적인 게임에서는 매우 매력적이지만, 모바일 GPU의 성능 기준에는 맞지 않습니다. 보급형 기기의 대역폭이 낮기 때문인데, 모바일 타이틀을 제작할 때는 최대한 많은 기기에서 원활하게 실행되는 것이 중요합니다. 모바일 프로젝트의 조명을 최적화하려면 유니버설 렌더 파이프라인을 사용하는 것이 좋습니다.

미리 빌드된 스크립터블 렌더 파이프라인(SRP)인 유니버설 렌더 파이프라인은 성능을 위해 마련된 기능으로, 기본적으로 포워드 렌더링을 사용하며 앱이 최대한의 성능을 발휘할 수 있도록 지원하는 다양한 기능을 갖췄습니다(자세한 내용은 여기에서 확인하실 수 있습니다).

조명 베이크 오프

플랫폼과 관계없이 렌더링 성능을 가장 크게 업그레이드하는 방법은 라이트맵에 조명을 베이크하고 라이트 프로브를 사용하는 것입니다. 실시간 조명을 사용할 경우 직접 조명이나 그림자 같은 기능은 렌더링되는 모든 프레임마다 따로 계산되어야 합니다. 화면 내 광원 수에 따라 컴퓨팅 비용이 비싸질 수 있습니다. 화면에 얼마나 많은 콘텐츠를 표시하느냐에 따라 성능 예산은 크게 제한됩니다. 이런 제한을 해결하기 위해 많은 계산이 오프라인에서 사전에 컴퓨팅되는데, 이 프로세스를 “라이트맵 베이킹”이라고 합니다.

라이트맵 베이킹은 텍스처 또는 “라이트맵”에 조명과 그림자에 대한 정보를 저장합니다. 이 테크닉은 현실감을 높이는 반사광이나 소프트 섀도우 등 컴퓨팅 집약도가 높은 조명의 특성을 저장할 수 있습니다. 그러나 라이트맵을 사용할 때 알아야 할 몇 가지 제약이 있습니다. 완전히 베이크된 조명은 씬의 동적 요소와 연동하여 업데이트되지 않습니다. 따라서 라이트맵에는 동적 오브젝트를 추가할 수 없습니다. 그러나 다행히 동적 오브젝트도 사전 계산 솔루션이 있는데, 바로 “라이트 프로브”입니다.

라이트 프로브는 오프라인에서 계산할 수 있는 라이팅 데이터를 저장한다는 점에서 라이트맵과 동일한 장점이 많습니다. 컴퓨팅 비용의 대부분은 런타임이 아니라 수정 작업을 하는 동안 발생합니다. 라이트맵이 씬에서 표면에 해당하는 텍셀에서 받은 조명을 인코딩한다면, 라이트 프로브는 씬의 빈 공간을 통과하는 조명을 저장합니다. 이 데이터는 움직이는(동적인) 오브젝트를 비추는 데 사용될 수 있으며, 씬 내에서 라이트맵을 사용하는 오브젝트와 통합해 시각적 품질을 높입니다.

텍셀

텍스처 요소인 텍셀은 텍스처 맵의 개별 픽셀입니다. 따라서 이런 텍셀은 라이트맵을 구성하고 조명 정보를 인코딩하는 단위입니다. 텍셀 관리는 라이트맵의 조명 품질과 베이크에 소요되는 컴퓨팅 시간, 디스크 저장 비용, 비디오 램(VRAM) 비용에 영향을 줄 수 있습니다.

조명 베이크를 준비했다면, 라이트맵 해상도를 정의하고 단위당 텍셀 수를 지정해야 합니다. 이때 단위는 Unity의 기본 단위로 계산된 정의된 범위를 말합니다(대부분의 경우 미터입니다). Unity의 Lighting 창에서 Lightmap Resolution 프로퍼티를 확인할 수 있습니다. 씬에서 텍셀이 어떻게 표현되는지 확인하려면, 씬 뷰에서 첫 번째 드롭다운 메뉴를 클릭하여 Draw Mode로 설정하고 Show Lightmap Resolution을 선택하거나, 동일한 메뉴에서 Lightmap Indices를 클릭합니다.

이렇게 하면 베이크된 오브젝트가 체커보드 오버레이로 덮입니다. 이것이 조명을 베이크할 때 텍셀이 분포되는 방식입니다. 아래 이미지는 동일한 큐브에 서로 다른 두 가지 설정을 적용한 예입니다. 왼쪽 큐브는 설정 값이 5이고 오른쪽은 2.5입니다. 변수 값이 클수록 더 많은 컴퓨팅이 필요합니다. 해상도가 낮을수록 필요한 라이트맵 공간도 적고, 라이트맵의 수도 적습니다. 그러나 해상도가 낮을수록 품질도 낮아집니다. 프로젝트에 어떤 해상도를 적용할지는 테스트를 통해 찾아 보세요.

베이킹을 할 수 없는 경우의 팁, 눈속임

대부분의 요소에 오프라인 베이킹을 사용한다고 해도 캐릭터 그림자 등 게임 내에서 실시간 효과를 사용해야 하는 경우도 있습니다. 실시간 그림자는 일반적으로 “섀도우 맵”이라는 테크닉을 사용해 생성합니다. 섀도우 맵에 렌더링되는 씬 지오메트리의 비용은 그려지는 버텍스 수에 비례합니다. 따라서 그림자를 드리우는 지오메트리와 실시간으로 그림자를 드리우는 광원 수를 제한하는 것이 중요합니다.

실시간으로 효과를 표현하려면 캐릭터 아래에 작은 3D 메시를 배치하고 흐릿한 텍스처를 적용합니다. 이 방법은 간단하면서도 그림자를 매핑하는 데 필요한 비용을 소요하지 않고도 그림자를 표현할 수 있는 효과적인 방법입니다.

--

조명을 설정하거나 베이크하려는 경우, 프로젝트를 최적화하려는 경우, 또는 단순히 게임 조명에 흥미가 있는 경우 등 의도에 따라 게임의 멋진 비주얼을 구현할 수 있는 기술이 있습니다. 게임은 다양한 분야의 전문 기술을 고유의 방식으로 표현할 수 있습니다. 팀원들에게 조명 관련 지식을 공유해 주세요. 팀원들이 기뻐할 테니까요.

2020년 6월 15일 게임 | 5 분 소요

Is this article helpful for you?

Thank you for your feedback!