넷마블에프앤씨 박명훈 TA, 언리얼로 만드는 ‘일곱 개의 대죄 오리진’ 비주얼 기법 소개
30일 넷마블에프앤씨 퍼니파우 박명훈 TA(테크니컬 아티스트) 실장이 29일 막을 올려 오는 9월 1일까지 진행되는 언리얼 페스트 2023 서울에 참가해 자사에서 개발 중인 크로스플랫폼 게임 ‘일곱 개의 대죄 오리진’의 아니메 스타일 비주얼을 어떻게 만들고 있는지 설명하는 시간을 가졌다.
박명훈 TA는 본격적인 발표에 앞서 현재 개발 중인 ‘일곱 개의 대죄 오리진’에 대한 간략한 소개를 진행했다. 이 게임은 원작 만화 IP(지식 재사)를 활용해 모바일과 PC 등 크로스 플랫폼을 지원하는 오픈 월드 액션 어드벤처 RPG다.
이용자들은 영웅과 무기 조합으로 나만의 덱을 자유롭게 구성해 몬스터를 공략하는 스타일리시한 태그 액션의 재미를 만끽할 수 있다. 특히, 오픈 월드 게임답게 다양한 지역과 환경 안에서 여러 가지 콘텐츠를 즐길 수 있는 것도 강점이다.
게임을 개발 중인 TA 팀에서는 이용자들이 게임을 굳어 있지 않은 살아있는 세계로 느낄 수 있도록 환경의 생동감 비주얼 표현, 전투 액션 환경, 몬스터, 캐릭터, 몬스터 등의 비주얼에 노력을 기울여 작업하고 있다고 한다.
관련해 이번 강연은 ▲아니메(ANIME) 스타일 기법 ▲동적 환경의 비주얼 표현 ▲IK(Inverse kinematics, 운동 역학) 처리와 기타 팁 등 크게 세 부분으로 나뉘어 진행됐다.
넷마블에프앤씨는 아니메 스타일 스타일의 비주얼을 구성하면서 오픈 월드 환경 속에서 캐릭터가 환경의 빛깔에 이질적이지 않도록 하는 것에 중점을 뒀다고 설명했다. 그래서 모든 라이트가 캐릭터와 배경이 함께 처리되는 방향으로 작업을 했다고 한다. 이를 위해 캐릭터 셰이딩 모델을 개발했고, 몇몇 부분은 아니메 스타일에 맞춰 튜닝도 진행했다.
박 TA는 이번 강연은 ‘일곱 개의 대죄 오리진’ 캐릭터의 셰이더 항목과 처리 방법에 대해서 소개하는 자리로 기본적인 셰이딩 모델을 추가하는 기본적인 방법 등은 이미 공개된 다른 자료를 참고할 것을 추천하며, 어떤 기법으로 게임을 만들고 있는지 강연을 본격적으로 시작했다.
현재 ‘일곱 개의 대죄 오리진’의 캐릭터는 선명한 광택이나 그림자가 그려진 기존 디퓨즈 텍스쳐를 걷어내고, 실시간 라이팅 환경에서 그림자와 광택을 처리하기 위해 많은 것을 걷어내도 알베도화를 진행했다고 한다.
이어 그래디언트 컬러도 기존에는 마치 팔레트처럼 구성하고 컬러를 골라서 쓰는 것처럼 사용했으나 면적이 부족해 표현하기 힘들다는 문제가 있다고 한다. 이에 버텍스에 컬러를 칠해서 합성해 사용하는 간단한 방식으로 준비했다. 간단하지만 캐릭터에 풍부함을 더해준다고 한다.
스페큘러는 캐릭터가 물리 기반 렌더링(PBR)이 아닌 만큼 가벼운 블린 퐁 스페큘러를 사용했고, 메탈릭은 좀 더 아니메스러운 철 질감을 위해 블린 퐁을 크게 잡고 반전 시켜 아니메 스타일이 나올 수 있도록 구현했다. 이 작업은 셰이딩 모델의 BxDF 함수에도 작업을 해야 하지만, 스카이 라이트가 처리되는 리플렉션 인바이런먼트 픽셀 셰이더에도 작업을 해줘야 광택이나 메탈릭 처리 효과를 얻을 수 있다.
캐릭터 암부 표현은 암부가 탁해지는 것을 막기 위해 암부에만 색을 집어넣었다. 이 처리는 스카이 라이트에서 처리하는 만큼 앞서 이야기한 리플렉션 인바이런먼트 픽셀 셰이더 파일에서 작업해야 한다고 한다.
이어 캐릭터 얼굴에 생기는 그림자는 섀도우 마스크를 활용했다. 텍스쳐에 그림을 그린 마스크이지만, 실제 라이팅 연산을 해서 생긴 명암과 함께 어우러질 수 있도록 했다. 그림으로 그림 마스크이지만 실제 라이트의 암부와 함께 색이 변하고 실제처럼 느껴질 수 있도록 했다. 셰이더 모델 파일에서만 작업하면 된다고 한다.
페이셜 섀도우 마스크는 얼굴의 명암을 각도별로 미리 만들어 놓고 라이팅에 맞춰서 사용하는 방식이다. 아니메 스타일의 게임에서 워낙 많이 쓰이는 방식이라 자료가 많으니 이를 참고하면 되겠다.
그리고 이것이 전부가 아니다. 넷마블에프앤씨 개발진은 두 가지 작업을 추가했다. 먼저 코너 셰이드라고 이름을 붙여서 사용 중인 셰이딩은 시점의 면과 시점과의 각도가 수직에 가까울수록 어둡게 그라데이션을 만드는 셰이딩이다. 애니메이션이나 아니메 스타일의 일러스트에서 실제 라이팅과 무관하게 어느 정도 볼륨감을 위해 넣어주기 위해 표현하는 스타일이다. 이를 게임에서 구현한 것으로 어울리는 재질에만 넣는다고 한다. 림라이트 반대라고 볼 수 있다.
소프트톤 명암도 활용했다. 외곽만 부드럽게 구성하니 너무 명암 톤이 2개로 나뉘어 큰 캐릭터의 경우 심심할 수 있는 모습이 나왔다고 한다. 너무 칼 같은 두 가지 색의 명암보다 좀 더 스무스하도록 소프트톤 명암을 활용해서 표현했다.
앰비언트 오클루전(AO)은 캐릭터의 셰이딩을 만드는 것보다는 림라이트를 제거하기 위해서 사용하고 있으며, 버텍스 컬러 A 채널에 버텍스로 베이크를 해서 해당 데이터를 사용한다는 설명이다.
지금까지 이야기한 한 캐릭터 관련 셰이딩은 머티리얼 통해서 G버퍼로 넘겨지고, G버퍼에 그려진 것을 셰이딩 모델이 셰이더 코드에서 읽어 사용하는 일반적인 형태다.
다만 디퓨즈 텍스쳐와 그래디언트 컬러는 언리얼 머티리얼에서 곱하기 연산을 통해 베이스 컬러로 들어간다. 또 코너 셰이드, 섀도우 마스크, 앰비언트 오클루전은 커스텀해 사용하는 G버퍼 D영역에 넣어서 쓰고, 셰이드 컬러는 G버퍼 E를 통째로 쓴다.
계속해서 스피리컬 하모닉(SH)처리에 대한 설명을 이었다. SH처리를 엔진이 가지고 있는 것을 그대로 아니메 게임 스타일에 쓴다고 하면 망가지는 부분이 있어, AO를 제외하고 SH에 가중치 값을 활용해 얼굴이 생기지 않도록 했다
환경광 림라이트 부분에서는 스카이 라이트에 의해서 만들어는 환경광 림라이트와 조명등 여러 가지에 의해서 만들어지는 림라이트 2개를 조금 다른 방식으로 처리했다. 환경광 림라이트는 별도의 처리를 하지 않으면 개발자가 정해둔 색으로 들어가기 때문에 캐릭터마다 따로 설정해야 한다. 면의 각도를 계산하고 SH값을 얻어서 사용하면 캐릭터에도 자연스럽게 구현된다고 한다.
직사광 림라이트는 컬러는 그대로 가져가지만, 카메라 시점과 각도를 적절히 계산해 림라이트 밝기를 조절하면 밝아지고 은은해지는 더 사실적인 림라이트가 나온다. 역광 때 더 강력한 연출을 위해 세팅하거나 기능을 만드는 등의 부가적인 일들을 따로 안 해도 되는 것이 강점이다.
그림자도 튜닝했다. 언리얼의 그림자는 품질이 우수해 그대로 써도 되지만, 아니메 스타일의 경우 그림자 해상도가 조금만 떨어져도 아니메 스타일과 어울리지 않고, 선명하지 않을 수 있다고 한다. 이에 캐릭터 셰이딩 모델에는 샤픈 필터를 활용해 튜닝해 선명한 그림자를 추가했고, 배경은 원래 언리얼의 품질 좋고 섬세한 그림자를 사용했다.
얼굴에 생기는 지저분한 그림자는 얼굴 자체의 그림자와 머리카락의 그림자 때문에 발생하는 문제다. 현재 넷마블에프엔씨는 섀도우 뎁스와 씬 뎁를 비교해서 너무 가까우면 그림자를 그리지 않게 처리했다. 주인공과 머리 사이 정도의 공간이면 머리카락이 그려지지 않지만, 멀리 있는 나무의 그림자 등은 캐릭터 얼굴에 그려진다.
여기에 머리카락 그림자를 그리지 않도록 했기 때문에 심심할 수 있어 캐릭터용 콘택트 섀도우 유사 처리와 단순하게 근거리 뎁스를 비교해 2D 그림자처럼 만들어 처리했다. 그늘에서도 보일 수 있고, 환경광 연산 때도 처리한다.
아니메 기법 소개에 이어서는 게임의 동적 환경 비주얼을 표현을 위한 발표가 진행됐다. 박 TA는 게임의 시간 표현, 지역별 환경 비주얼, 환경 이벤트 연출, 바람 표현 등을 소개했다.
시간 표현을 위해서는 테이블에 원하는 시간의 변화에 따른 원하는 값을 지정해 블렌딩 해서 쓰고 있고, 태양의 라이팅 값과 풀들의 수평 반사 컬러, 포그 컬러, 구름의 컬러 등을 볼륨으로 설치했다. 볼륨 간의 블렌딩이 가능하게 만들어 지역에 대한 비주얼을 세팅했다. 지역바다 환경이 달라질 수 있도록 했다.
또 이것을 응용해 특정 이벤트 때에만 특정 볼륨이 켜질 수 있도록 세팅했다. 특정 이벤트가 발생하면 해당 이벤트에 맞는 환경과 이펙트가 작동한다.
바람효과는 지역 전체에 적용해 강한 바람이 부는 지역과 잔잔한 바람이 부는 지역을 만들었다. 그리고 VFX 바람은 언리얼 엔진의 나이아가라를 활용해 렌더 타켓 텍스쳐(RT)에 바람으로 쓸 방향 벡터의 텍스쳐를 그려 활용했다. 방향 벡터 텍스쳐를 잔디에 써서 잔디가 움직이는 것처럼 보이게 하고, 보스가 스킬을 쓸때도 바람을 빨아 들이는 등의 모습이 나오면 바람모양이 변하게 만들었다. 이를 응용해 잔디가 사라지거나 불이 붙는 형태도 준비했다.
옷과 헤어도 기본적으로 지역에 설정한 바람을 활용해 기본적인 헤어의 움직임이 작동할 수 있도록 만들어서 사용 중이다. 바람 이벤트를 생성하는 애님 노티파이(AnimNotify)로 옷과 헤어에 효과를 준다. 스킬 표현등에 활용할 수 있다. 또 풍차 같은 바람효과가 있는 컴포넌트를 통해서도 바람 이벤트를 만들었다. 근처에 가면 머리카락이 움직인다.
마지막으로 IK처리와 기타 팁 부분에서는 포즈 워핑, 콜라이더, 포탈효과, 얼굴 명암, 눈처리 등이 소개됐다.
포즈 워핑은 언리얼 5에서 추가된 기능이다. ‘일곱 개의 대죄 오리진’에서는 스트라이드 워핑과 슬로프 워핑을 사용한다고 한다.
스트라이드 워핑은 캐릭터의 이동에 맞춰서 자동으로 보폭을 맞추는 기능이다. 이를 활용하지 않으면 애니미에션을 아무리 이동 속도에 맞춰서 만들어도 실제 속도와 게임 속 캐릭터 보폭이 맞지 않는 것이 나온다. 스트라이드 워핑을 쓰면 보폭이 실제 이동 속도와 같은 모습을 보여준다. 여기에 슬로프 워핑은 기울기에 다른 워핑으로 계단 등에서 캐릭터가 튀는 것도 방지해준다.
박 TA는 헤어&크로스와 관련한 물리 애니메이션 팁도 전했다. 다양한 부분에서 테스트를 해봤는데 만족할 만한 것이 나오지 않았다고 한다. 보통 콜라이더를 쓸 때 구나 박스, 플렌 등을 쓰거나 섞어 쓰는데, 넷마블에프앤씨는 구부릴 수 있는 형태의 플렌을 만들어서 활용한다고 한다. 구부릴 수도 있고, 구나 박스로 해야하는 것도 모두 가능하다는 강점이 있다.
또 머리카락 애니메이션 처리를 할 때 헤어에 키를 안 잡으면, 머리카락이 등을 뚫어 버리는 경우가 나온다. 이 상태로 물리 애니메이션 처리하면 뚫린 상태로 진행된다. 이에 넷마블에프앤씨는 충돌 처리를 두 번 한다. 등을 뚫은 머리카락을 밀어주고, 그다음에 애니메이션 처리를 하고, 마지막으로 다시 충돌 처리를 해주면 등을 뚫더라고 더 자연스럽게 보인다는 것이 박 TA의 설명이다.
캐릭터 얼굴 명암에 대한 설명도 나왔다. 보통 세로축 명암만 가진 텍스쳐를 사용하기 때문에 가로 조명 등이 사용되면 적절하지 않을 수 있다. 그러면 얼굴만 하얗게 뜨는 현상이 나기도 한다, 이에 넷마블에프앤씨는 조명의 기울기 값을 자르고 변화를 줘서 조명이 기울어져도 어색하지 않도록 사용하고 있다.
눈알 처리와 관련한 팁도 전했다. 눈알을 폴리곤으로 그려서 활용하면 홍채에 그림자가 그려지지 않거나, 보는 각도에 따라 모양이 이상해지는 것은 물론 애니메이션에서 홍채를 움직이게 하기 위해서는 노력이 많이 들어간다.
이에 넷마블에프앤씨는 눈의 피봇을 기준으로 눈알의 UV를 만들어 활용했다. 눈꺼풀을 움직여도 그림자가 유지되고, 눈알에 그려진다. 이렇게 완성하면 애니메이션을 할 때도 눈을 더 깔끔하게 표현할 수 있다.
마지막으로 포탈 효과다. 게임에서 흔히 쓰지만 아니메 게임에서 마땅히 쓸만한 것이 없었다고 한다. 이에 포털 효과를 사용할 캐릭터의 머티리얼에서 작업했다. UV와 앞과 뒤를 구해서 포털 텍스쳐를 발라주는 형태로 만들었다.
강연을 마친 이후에는 Q&A 시간이 진행됐다. 최적화 관련 질문에 대해서는 현재 콘솔 버전을 중심으로 진행 중이라 밝혔으며, 콘솔 최적화는 문제 업다고 밝혔다. 다만, 모바일과 콘솔을 동일한 수준으로 준비하지는 않는다고 설명했다.