지난 9월 28일 PS4, PC, 모바일로 출시된 '원신'은 원화를 그대로 옮긴 듯한 고퀄리티 카툰렌더링 그래픽과 자유도 높은 오픈월드, 원소 간 상호작용을 활용한 다이나믹한 전투 등 다양한 요소로 유저들의 호응을 얻었다. 특히 각 지역의 특색이 드러나는 배경에, 시간과 기후의 변화에 따라서 시시각각 바뀌는 풍경을 게임 내에 구현해 세상을 떠돌며 모험하는 느낌을 한 층 살렸다.

붕괴3rd에서 이미 한 차례 고퀄리티 카툰렌더링 기법의 노하우를 공유한 적이 있는 미호요. 이번 유나이트 서울 2020에서는 원신에서 구현한 다양한 기법을 미호요의 이젠종 테크니컬 디렉터가 온라인 강연으로 소개했다.



젠종 테크니컬 디렉터는 미호요에서 유니티를 고른 이유로 유연하고 코딩 스타일이 깔끔한 점을 꼽았다. 또한 모듈을 수정하기가 매우 간편하고, 유니티의 기술 지원도 전문적이고 신속해서 믿을 수 있다는 점도 유니티로 작업한 이유로 손꼽았다.

원신의 렌더링 파이프라인은 PC와 콘솔을 한데 묶어서 콘솔 렌더링 파이프라인, 모바일 렌더링 파이프라인 크게 두 가지로 나눠서 적용했다. 기본 토대는 둘 다 동일하게 사실적인 렌더링으로 유명한 PBR을 기반으로 하고 있으며, PS4는 모바일보다 늦게 시작했지만 금방 따라잡고 PC, PS4, 모바일 세 플랫폼 지향으로 동시 개발을 진행했다. 따라서 콘텐츠 제작과 개발 과정에서 세 플랫폼 모두를 고려해야 했다.


원신에서는 게임 내 24시간 주기가 구현되어있다. 즉 시간대와 날씨에 따라서 조명이 변해야 했다. 이러한 변화를 구현하기에는 PBR 기반이 적합해서 이를 채택했다고 밝혔다. 그러나 실사 그래픽 기반이 아닌 만큼, 일반적인 PBR이 아니라 아트팀의 지시에 따라 마테리얼을 수정하는 과정을 거쳤다.

PS4 프로에서는 네이티브 4K 해상도를 지원하는 만큼 그대로 해상도를 맞췄으며, PS4에서는 1440p 해상도로 렌더링한 뒤 최종 출력 시에 1080, 즉 HD 해상도로 나오게끔 해서 좀 더 깔끔하고 선명하게 나오도록 했다. 콘솔 렌더링 파이프라인에는 절반 이상이 컴퓨트 셰이더를 활용했으며, 이를 통해 비동기식 컴퓨트 파이프를 활용하는 플랫폼에서 GPU 리소스 소모를 줄였다.


원신의 그래픽 구현에서 가장 신경을 쓴 부분은 조명과 마테리얼 부분이었다. 실사가 아닌, 애니메이션풍을 지향했던 만큼 실사 기반 게임의 기법을 그대로 사용하면 어둡고 칙칙하고 지저분한 느낌이 들었다. 그래서 밝고 선명한 애니메이션풍 느낌을 살리기 위한 조명 및 마테리얼 구축에 힘썼으며, 일부 기능은 아직도 진행 과정 중에 있다.

이 같은 문제를 해결해도 남은 과제들이 있었다. 우선 그간 미호요에서 사용한 유니티 엔진이 모바일 게임 개발용으로 많이 커스터마이징 되어있어 PS4로 빌드 전환이 쉽지 않았다. 뿐만 아니라 중국 내에는 콘솔 게임 개발 경험이 있는 개발자가 없어서 한동안 쩐종 디렉터 혼자 작업을 설계해나가야 했다. 아울러 PS4용 개발팀에게 주어진 시간은 1년 반 정도밖에 없고 차이나조이에 TGS까지 출품해야 하는 난제가 겹쳐졌다.

그래서 연구 시간이 많은 기능은 제외하고, 정확히 알고 있는 기능과 구현 방식만 채택하는 원칙을 세웠다. 또한 시각적 스타일에 어울리면서 미세 조정에 시간이 걸리지 않는 기능만 채택하기로 하고 개발 에 돌입했다.

기술적으로 원신에서 가장 중시한 부분은 무엇일까? 첫 번째로는 방향 광원에 따른 그림자의 변화를 꼽았다. 오픈월드 게임인 만큼 플레이어는 대부분의 시간을 야외에서 보내게 되는데, 그만큼 햇빛이나 달빛의 변화에 따라 바뀌는 그림자 구현이 중요한 포인트였다. 또한 그림자의 묘사에 따라 물체에 이질감도 덜할 수 있었다. 원신에서는 가까운 그림자는 디테일하게 표현하는 한편, 원거리에 반영되는 그림자도 구현하면서 원거리에 있는 물체도 사실감을 불어넣었다.

▲ 오픈월드인 만큼 다양한 상황에서의 그림자 표현을 어떻게 하느냐가 중요했다

이를 위해서 캐스케이디드 섀도우 맵과 푸아송 노이즈 소프트 섀도우를 활용했다. 일반적으로 캐스케이드는 4개 정도 활용되지만, 원신에서는 퀄리티를 업그레이드하기 위해서 8개까지 활용했다. 다만 캐스케이드를 많이 활용하면 CPU, GPU에 리소스 소모가 높아지므로 유의해야 했다.

CPU에서 부하를 줄이기 위해서 최초 캐스케이드 4개는 매 프레임마다 업데이트하되 나머지 4개의 캐스케이드는 각 프레임마다 하나씩만 업데이트해서 매 프레임당 총 5개씩만 업데이트되도록 했다. 이렇게 해서 드로우콜 횟수를 줄이는 식으로 부하를 감소시킬 수 있었다. GPU 부하를 줄이기 위해서는 소프트 섀도우가 가장자리에만 지는 것에 착안, 가장자리만 소프트 섀도우 계산을 적용하도록 했다.

▲ 효과를 주기 위해 캐스케이드를 늘린 만큼 부하가 갈 수밖에 없는 상황

▲ 매번 전체 다 업데이트 하는 방식을 바꿔서 드로우 콜을 줄이거나

▲ 일부에만 적용하는 식으로 GPU 부하를 낮췄다

또한 전체 마스크를 하나하나 다 계산하는 대신 블록 단위로 묶었으며, 그로 인해서 정밀도가 떨어지는 문제는 가장자리 영역을 확대하면서 일부 해결했다.

캐릭터가 붕 떠있지 않고 땅에 서있는 것처럼 보이기 위해서는 앰비언트 오클루전 기술을 활용했으며, 크게 세 가지로 나눠서 적용했다. 표준적으로 사용되는 HBAO 외에도 정적인 오브젝트에는 AO 볼륨을 활용했으며, 캐릭터에는 캡슐 AO을 적용했다. HBAO로는 성능상 한계로 물체에 그림자가 드리우는 등 세밀한 효과를 렌더링할 수 없어 오브젝트엔 AO 볼륨을 사용했으며, 애니메이션이 적용되는 캐릭터에 AO 볼륨을 사용할 수 없기 때문에 캡슐 AO가 적용된 것이라고 덧붙였다.


▲ AO를 적용하면 그림자 차이가 확연히 보인다

▲ 성능 및 알고리즘 이유로 오브젝트에는 AO 볼륨을 활용했으며

▲ 애니메이션이 입혀진 캐릭터엔 AO 볼륨을 쓸 수 없어 캡슐 AO를 캐릭터의 골격에 맞춰 적용했다

그림자를 만들어내는 로컬 광원은 클러스터 디퍼드 라이팅으로 구현, 시야 내 최대 1,024개의 광원이
지원된다. 화면은 4K 해상도 기준으로 64*64 픽셀 타일로 분할했으며 각 타일은 뎁스 방향에 따라 16개의 클러스터로 나누었다. 로컬 광원 시스템은 실시간으로 그림자를 드리우는 약 100개 가량의 광원을 지원하고 있으며, 섀도우맵 해상도는 우선 순위와 뷰 거리에 따라서 자동으로 조정되도록 했다.

각 로컬 광원의 최종 그림자는 사전 베이크된 정적 그림자 텍스처와 동적 오브젝트가 프레임마다 만들어낸 그림자가 혼합된 것으로, 그림자 텍스처는 BCn 압축으로 처리하면 열화가 일기 때문에 자체적으로 압축 알고리즘을 구축했다. 각 모드별, 블록별로 압축 정도를 다르게 처리하는 방식으로 SIGGRAPH 2019에서 워너브라더스의 보 리 엔진 개발자가 공개한 텍스처 압축 방식과 유사한 방식이다.

▲ 최대 1,024 라이트가 뷰 안에 지원되지만, 실제론 100개 정도까지 사용됐다

▲ 참고 자료는 ACM 디지털 라이브러리에 있다

아울러 배경을 흐릿하게 보이게 하는 볼류메트릭 포그에 대해서도 소개를 이어갔다. 볼류메트릭 포그는 물리 기반 조명 산란에 따라 계산된 효과로, 아티스트가 여러 파라미터를 설정해서 월 드곳곳의 볼류메트릭 포그를 조정할 수 있다. 카메라 뷰 기반으로 되어있기 때문에 뷰 자체를 복셀로 구분하고, 클러스터에 따라 정렬한 뒤 볼류메트릭 포그에 로컬 광원 정보를 추가하는 식으로 구현했다.

이외에도 빛줄기를 직접 만드는 것이 아니라 별도의 패스를 활용해 5개의 캐스케이드를 샘플링하고 1/2*1/2 해상도 텍스처에 작성되어 볼류메트릭 포그에 혼합되게끔 설정했다. 이러한 번잡한 과정을 거친 이유는 볼류메트릭 포그만으로 GPU 리소스를 과다하게 먹지 않고 깔끔하고 선명한 광선을 만들기 어려웠기 때문이었다. 또한 볼류메트릭 포그만으로 광선을 깔끔하게 만들려면 밀도가 높아야 하는데, 자칫하면 화면이 난잡해질 수 있어서 볼류메트릭 포그에 별도 패스를 활용하고 블렌딩하게끔 설계했다.

▲ 은은한 빛 효과를 위해 볼류메트릭 포그를 적용하고

▲ 빛줄기는 별도의 패스를 활용해서 구현했다

▲ 포그만으로도 빛줄기는 구현할 수 있지만, 그만큼 밀도가 뒷받침되야 해서 화면이 지저분해진다고

원신에서는 조명이 계속 변하는 만큼, 이미지 기반 조명에는 반사 프로브와 앰비언트 프로브 두 가지가 쓰였다. 조명이 지속적으로 변하기 때문에 하나의 큐브맵을 베이크할 수 없는 대신 런타임 시 미니 G-버퍼에서 큐브맵을 생성하는 식으로 구현했다. 런타임 반사 프로브 생성은 재조명, 컨볼루션, 압축 3단계로 이루어지며 컴퓨트 셰이더로 큐브맵의 6면을 동시에 처리할 수 있었다.

반사 프로브의 재조명 단계가 끝나면 현재 조명 조건을 반영할 수 있는 큐브맵이 준비되는데, 이떄 앰비언트 프로브를 활용해 앰비언트 정보를 가져와 SH값으로 저장할 수 있도록 했다. 앰비언트 프로브에서는 반사 프로브와 마찬가지로 컴퓨트 셰이더로 6면을 동시에 처리할 수 있다.

▲ 매 시간마다 바뀌는 조명에 따라 달라지는 빛 구현에는 두 가지 프로브가 쓰였다

▲ 지속적으로 변하기 때문에 큐브맵은 하나로 베이크가 안 되고, 재조명하고 불러오는 식이다

▲ 앰비언트 프로브에서 정보를 가져와 SH값으로 저장하고, 6면을 동시에 컴퓨트 셰이더로 처리한다

▲ 다만 재조명 패스엔 그림자 정보가 없기 때문에 인위적으로 보강할 필요가 있다


다만 이 단계에서는 재조명 패스에 그림자가 없기 때문에 2시간마다 미니 G-버퍼용 섀도우 맵을 베이크하고 3밴드 그림자 SH에 저장해서 시간에 따른 그림자 효과를 인위적으로 보강했다. 여기에 로컬 광원 정보까지 더해서 효과를 더욱 자연스럽게 보완해나갔다.

또한 단순 반사 프로브, 앰비언트 프로브만으로는 픽셀이 실내/실외 구분이 안 갔기 때문에 실내/실외용 프로브들로 구분하고 따로따로 적용했다. 해당 방법은 아티스트들이 실내 씬에 인테리어 메시를 구축하고 씬을 래핑해서 실내 픽셀이 정확하게 표현하게 하는 식으로 처리했다.

반사를 한 층 더 자연스럽게 실시간으로 표현하기 위해서는 반사프로브 외에도 스크린 공간 반사를 적용했다. 그렇게 해서 PS4 프로 기준으로 약 1.5밀리초마다 실시간 처리가 되고, 더욱 매끄럽고 자연스러운 반사 효과 표현이 가능해졌다.



▲ 여기에 스크린 공간 반사까지 더하고


▲ 실내 / 실외를 구분지어서 씬을 래핑, 실내가 좀 더 정확하게 표현되도록 했다

젠종 디렉터는 마지막으로 HDR 디스플레이 대응에 대해서 언급했다. 현재 원신에는 SDR과 HDR에 대응하는 파이프라인 두 종류가 구축되어있으나, 현재 PS4에는 일부 기술적인 이슈로 HDR 모드를 지원하지 않고 있다. HDR모드에서는 톤 매핑 기능이 없는 만큼 별도의 RT로 렌더링된 다음 별도 소프트웨어의 컬러표와 RRT+ODT을 활용하지만, RRT+ODT는 회색 기반이라 다소 칙칙할 수 있어 원신에서는 사용되지 않았다. 이를 셰이더의 색조 변화를 모방해서 컬러 룩업표 생성패스에 결합하는 방식으로 해결하고자 했으며, 문제가 어느 정도 해결이 된 상태다. PS4용으로는 1.2 버전부터 HDR 모드를 지원할 예정이다.

미호요에서는 처음으로 콘솔용 게임 개발을 도전하면서 어려움이 많았지만, 노력 끝에 원신의 스타일에 맞는 그래픽을 구현해냈다고 쩐종 디렉터는 소회했다. 그렇지만 아직 안정성, 그래픽 기능, 로딩 시간 등이 완벽하지 않은 만큼 앞으로 더욱 더 개선해나갈 것이라고 덧붙였다.

▲ PS4에서 HDR 모드가 1.2 버전부터 지원되는 등, 그래픽에서도 계속 발전을 이어가고 있다