제한된 리소스로 영화 같은 환경을 만드는 방법

오늘의 게스트 포스트는 Lapsus Games의 공동 창업자이자 개발자인 알폰소 카파리니가 작성했습니다. 8월 28일, Lapsus는 데뷔작인 NODE: 안타리가 남긴 마지막 호의를 출시했습니다. 이 게임은 독특한 2.5D 퍼즐 어드벤처 게임으로, 놀랄 만큼 아름다운 인게임 조명을 자랑합니다. 전문 CG 아티스트인 알폰소가 Unity로 HDRP의 조명을 활용하여 NODE의 깊이 있는 분위기를 구현한 방법을 알아보세요.
저는 애니메이션 업계의 조명 아티스트로서, 원하는 비주얼을 구현하기 위해서라면 어떤 요소든 씬에 주저 없이 추가해 보곤 합니다. 그리고 제대로 작동하지 않는 부분이 있으면 합성을 통해 수정하죠. 하지만 그러면 파이프라인에서 단 하나의 프레임을 얻는 데에도 수십 시간에서 수백 시간을 렌더링해야 할 수 있습니다.
NODE: 안타리가 남긴 마지막 호의를 Unity로 개발하기 시작했을 때, 제가 주로 구현하는 시네마틱하면서도 깊은 분위기의 결과물을 얻기 위해서는 접근 방식을 바꿔야 했습니다. 하지만 그와 동시에 프레임당 60시간이 아닌 초당 60프레임이라는 성능 기준 또한 충족해야 했어요.
볼류메트릭 조명은 당연히 많은 리소스를 소모합니다. 하지만 저는 자체적으로 개발한 툴과 기법을 활용하여, NODE에서 풍성하고 영화 같은 느낌의 조명을 구현하면서도 씬을 단순하게 유지하여 준수한 성능으로 실시간 실행을 할 수 있게 만들었습니다.
평범한 출발점: 단 하나의 주요 조명
처음에는 다들 이렇게 하실 겁니다. 주요 조명 하나만을 추가하고 GI(전역 조명)가 나머지 부분을 마법처럼 채워 주기를 바라는 거죠.

씬을 베이크해 보면 GI가 도움은 되지만 원래 생각했던 분위기와 깊이감, 느낌을 정확히 구현하기에는 부족하다는 것을 알 수 있습니다. 그뿐만 아니라 의도한 비주얼을 구현하는 데 필요한 색감도 뜻대로 조정하기 어렵습니다.

볼류메트릭 효과로 뎁스 추가하기
분위기 있는 환경을 구현해야 하니 볼류메트릭 안개부터 적용해 보겠습니다. 그러면 바로 분위기와 깊이감, 방향성을 확보할 수 있습니다. 공기가 채워진 진짜 환경처럼 보이기 시작하죠.
하지만 이걸로는 아직 부족합니다.

이쯤 되면 주요 조명이나 GI로 처리하지 못하는 모든 공간을 채우기 위해 씬 여기저기에 거대한 조명, 그림자가 없는 조명 등을 배치하기 쉽습니다. 하지만 그렇게 하면 씬의 불륨과 입체감이 줄어들어 오히려 씬이 평면적으로 느껴지게 될 가능성이 높으며, 실행 속도도 더 느려질 수 있습니다.
저는 NODE를 제작하면서, 성능을 놓치지 않으면서도 빛이 공기에 부딪혀 반사 및 산란되며 공기의 밀도를 느낄 수 있게 해 주는 환경을 구현하고자 했습니다. 그래서 다음과 같은 방법을 고안했습니다.
지오메트릭 볼륨으로 빛이 공기에 산란되는 효과를 흉내내기
저는 NODE에서 원하는 조명을 구현하기 위해 부드러운 HDR 컬러의 그레디언트를 생성하는 아주 간단한 언릿 셰이더를 만들었습니다. 그리고 중간점, 감쇠, 이미션 멀티플라이어에 대한 컨트롤을 추가했습니다. 이 셰이더를 스피어, 캡슐, 박스, 커스텀 메시와 같은 기본 지오메트리에 입힌 다음, 빛이 공기 속으로 퍼지는 듯한 효과를 내려는 영역에 배치했습니다. 이러한 볼륨은 물리적으로 정확하지는 않지만 체감상으로는 사실적입니다.

비현실적이기는 하지만, 여기에는 따뜻한 느낌의 주요 조명에 대비되는 차가운 보색을 사용하여 색상의 구성을 더욱 풍성하게 만들었습니다. 레이어는 원하는 만큼 얼마든지 추가할 수 있으며, 서로 다른 강도로 쌓아 올려서 감쇠 방식을 더욱 세밀하게 제어할 수 있습니다.

그 결과 빛이 공기 중에 산란되면서 공간을 채우는 것처럼 느껴지며, 그 색조와 강도도 완벽히 제어할 수 있게 되었습니다.

이제 결과물과 그에 해당하는 라이트맵을 보면, 주요 조명의 빛줄기가 씬에 상당한 뎁스와 볼륨을 추가하는 영역을 기점으로 그레디언트가 생겨난 것을 확인할 수 있습니다.


안개, 그레디언트 스카이, 톤 매핑
다음으로는 씬의 크기에 맞는 뎁스를 더할 수 있을 만큼 기존 안개를 추가해서 씬을 보완했습니다. 그레디언트 스카이로는 밝기와 색상을 조정했는데, 이렇게 하면 컬러 팔레트를 통합하고 환경의 전반적인 색조를 설정할 수 있습니다.
마지막으로는 ACES 톤 매핑을 사용해서 모든 요소가 조화를 이루게 만들었습니다. 이를 통해 디테일을 지나치게 추가하지 않으면서도 좀더 영화 같은 느낌을 주는 씬을 최종적으로 완성할 수 있었습니다.

자연스러운 분위기 전환
또한 그레디언트 스카이로 색조를 적용한 볼류메트릭 조명과 안개, 대기 중 빛의 산란을 에뮬레이트하는 지오메트릭 볼륨을 사용한 덕분에 독특한 분위기와 매끄러운 전환을 구현할 수 있었습니다. 제가 만든 언릿 셰이더의 그레디언트 램프를 조정하는 한편, Unity의 볼륨 블렌딩을 사용하여 하늘과 안개의 분위기를 자연스럽게 전환하면 색조가 영향을 미치는 거리나 전환이 발생하는 지점을 원하는 대로 제어할 수 있습니다.
덕분에 많은 조명을 사용할 필요도 없었고 광원 베이킹 시간도 아주 짧게 유지되었습니다. NODE를 구성하는 150개 씬의 총 베이킹 시간이 1시간도 되지 않는다는 점이 자랑스럽습니다.

단일 메시로 복잡한 조명 구현하기
이번에는 몇 가지 예시를 통해서 간단한 기법만으로도 복잡한 조명을 손쉽게 구현할 수 있다는 점을 보여 드리겠습니다.
이 엘리베이터 통로에서는 지하의 초록 색조와 옥상의 푸른 색조가 자연스럽게 전환되도록 만들어야 했습니다. 여기서 저는 단 하나의 박스만으로 색상 기반을 만들어 전환 효과를 구현했으며, 이때 어떠한 성능 비용도 발생하지 않았습니다.

이 제어실과 같은 좁은 공간에서는 모니터와 씬 중앙 사이에 서로 다른 두 가지 분위기를 만들어서 조명 래핑을 자연스럽게 구현했습니다.


정리 및 결론
NODE: 안타리가 남긴 마지막 호의의 조명을 구현하기 위해서는 한계를 받아들이고 그 안에서 창의성을 발휘할 기회를 찾아야 했습니다. 애니메이션 업계에서 일했던 저는 기존의 상식을 상당 부분 뒤집어야 했습니다. 합성에 의존하지 않으면서 원하는 효과를 자연스럽게 구현하는 방법, 조명을 마구잡이로 사용하지 않으면서 사용자의 시선을 유도하는 방법, 성능을 저해하지 않으면서 풍성한 씬을 만드는 법을 찾아야 했죠.
제가 소개한 몇 가지 팁이 여러분의 프로젝트에 필요한 아이디어를 제공했기를 바랍니다. 혹은 맨 처음 떠오르는 원초적인 접근법보다 더 나은 방법은 언제나 존재한다는 점을 다시 한 번 상기하는 계기가 되어도 좋을 것 같습니다. 읽어 주셔서 감사합니다.
NODE: 안타리가 남긴 마지막 호의는 현재 PC와 콘솔에서 이용 가능합니다. 여기를 클릭하여 게임을 위시리스트에 추가하세요. Steam 큐레이터 페이지에서 Unity로 제작된 게임을 더 많이 팔로우하고, 리소스 페이지에서 Unity 개발자들의 더 많은 이야기를 확인하세요.
