Resogun부터 Returnal까지, 진화하는 VFX가 아트로포스에 생기를 불어넣습니다

0 0
Resogun부터 Returnal까지, 진화하는 VFX가 아트로포스에 생기를 불어넣습니다

촉수 기법, 안개 효과 등의 구현 방법을 자세히 알아보세요

Housemarque는 매력적인 게임플레이 외에도 최고 수준의 파티클 이펙트를 적용하기로 유명합니다. Resogun, Alienation, Matterfall, Nex Machina와 같은 타이틀은 VFX 기술을 사용한 화려한 폭발로 적 파괴 혹은 레벨 완료 시 플레이어를 보상합니다. Returnal을 제작하면서 Housemarque는 탑다운 시점이 아닌 3인칭 시점으로 전환했고, 보다 현실적이며 어두운 아트 스타일을 선보입니다. 이 글에서 리드 VFX 아티스트인 리스토 잰킬라(Risto Jankkila)와 시니어 그래픽 프로그래머인 샤먼 자가디산(Sharman Jagadeesan)이 VFX를 활용하여 외계 행성인 아트로포스와 생명체에 생기를 불어넣은 경험을 공유합니다.

하단에서 Returnal의 VFX를 다루는 분석 영상을 감상할 수 있으며, 이 글을 통해 영상 외의 상세 정보를 다루고자 합니다.

Resogun부터 Returnal까지, 진화하는 VFX가 아트로포스에 생기를 불어넣습니다

VFX 기술의 역사

저희는 Resogun (2013 PS4 런칭 타이틀)부터 VFX 작업에 참여하였고, 그 때 현재 파티클 시스템의 첫 프로토타입이 전시 효과에 사용되었습니다. Resogun 이후로 입자 시스템은 그래픽이 있는 유저 인터페이스를 갖게 되었고 이를 차세대 입자 시스템인 NGP(Next Gen Particle System)라고 이름 붙였습니다. 2014년에 Alienation의 모든 파티클 이펙트를 NGP로 제작하기로 결정했습니다. Alienation 출시 후에 이 시스템은 Nex Machina에 사용되었고 Matterfall에서는 Unreal 엔진으로 이식되었습니다.

NGP는 CPU의 부하를 최소화하여 GPU만 이용하는 VFX 시스템으로 설계되었으며 훌륭한 성능과 유연성을 확보하고자 했습니다. 입자의 행동과 데이터를 규정하는 셰이더 정보를 작성하여 VFX 아티스트가 파티클을 제작했습니다. 메모리 할당과 표준 형식 코드를 NGP가 처리하게 되어 아티스트는 행동과 비주얼에 집중할 수 있었습니다.

현재의 NGP는 파티클 이펙트 처리에만 국한되지 않으며 대량의 3D 화소 행동을 제어하거나 시간에 따라 변화하는 기하학적 구조를 만들 수도 있습니다. 그리고 데이터가 담긴 여러 모듈을 효과의 입력 요소로 사용할 수 있습니다.

예를 들어, 유체 시뮬레이션 모듈을 NGP에 시뮬레이션 데이터로 추가할 수 있습니다. 다른 예는 복셀라이저라고 부르는 모듈인데, 애니메이션 메시를 3D 화소로 변환하며, 해당 데이터는 볼륨메트릭 캐릭터 효과에 사용할 수 있습니다. 질감, 뼈대 매트릭스, 꼭지점 버퍼 같은 다른 자원들도 파티클 이펙트의 입력 요소로 활용할 수 있습니다.

촉수와 총알 흔적에 사용된 마법과 같은 VFX: 노드 파티클

Returnal 개발 초기부터 아트로포스의 적들을 특별하게 만들고 싶었습니다. 게임 디렉터인 해리 크루거(Harry Krueger)는 적들에게 생체 발광과 촉수 같은 심해 생물의 특징 부여하길 원했습니다.

적을 담당한 애니메이터들은 전통적인 뻣뻣한 몸의 물리 엔진을 사용하여 다수의 뼈로 이루어진 형태로 촉수를 만들어 보았습니다. 하지만 다수의 긴 체인을 만드는 작업이 효율적이지 않다는 한계가 있었고, 물리 엔진 시뮬레이션만을 사용해야 되기 때문에 적의 상태를 표현하는 방법도 한정적이었습니다. 이러한 상황 속에서 VFX가 적의 메시와 뼈대에 추가하는 촉수를 만드는 작업에 동원되었습니다.

다행스럽게도 이미 준비한 해결책이 있었습니다. 과거 프로젝트에서 식물 입자를 만들었고, 특히 나무와 같이 갈라지는 식물을 위해 이 특별한 입자가 개발되었습니다. 속성과 행동을 반영하여 이를 노드 파티클이라고 이름 붙였습니다.

이 입자 타입은 한쪽 방향으로 연결 가능한 “부모-자식” 형태를 이룰 수 있습니다. 한 입자는 여러 자식 입자를 연결할 수 있지만, 자식 입자는 한 명의 부모 밖에 가질 수 없습니다. 부모 입자의 경우 1 프레임이 늦은 데이터를 가집니다. 다시 말하면 현재 프레임에 입력되는 데이터가 아니라는 거죠. 따라서 자식 입자는 정확하게 부모 입자를 따라갈 수 없으며, 이 덕분에 움직임이 자연스러워 보이는 효과를 볼 수 있습니다. 이 파티클 이펙트는 Returnal에서 많이 사용되었으며 촉수와 같은 사물을 표현할 때 특히 유용했습니다.

촉수의 움직임을 작업하기 전에 먼저 어떻게 표현할지를 정해야 했습니다. 우선 가늘고 긴 폴리곤 조각을 렌더링하여 실험했습니다. 결과는 그럴싸했지만 그늘과 같은 구역이 조금 아쉬웠습니다. 얼마 후에 저희는 NGP가 실시간으로 만들어 내는 원통형의 메시를 촉수로 렌더링하기로 결정했습니다.

관 형태의 렌더링 작업을 결정한 다음 촉수의 움직임에 초점을 맞추게 되었습니다. 입자의 움직임을 제어할 수 있게 되면서 더 이상 물리 엔진 시뮬레이션에 국한되지 않고 적의 상태에 맞춰 촉수의 움직임을 변경할 수 있었습니다. 이를 통해 적이 공격을 준비할 때 특정 방향으로 촉수가 움직이게 만드는 등의 실험이 보다 쉽게 가능했습니다. 애니메이터 및 디자이너들과 함께 타이밍을 찾으며, 애니메이션과 기타 VFX를 통해 촉수의 움직임이 적의 상태를 나타내게 하였습니다.

노드 파티클은 띠와 흔적을 표현할 때에도 유용하게 사용되었습니다. 유도 총알은 길이가 긴 흔적을 갖고 있고, 총알이 지나간 다음에도 화면에 오래 남아 있도록 만들었습니다. 적의 근거리 공격도 노드 파티클을 사용합니다. 부모 입자를 따라가며 띠 형태의 흔적을 만드는 노드 파티클을 프리케의 유도 총알을 통해 영상에서 확인할 수 있습니다.

유체 시뮬레이션

시각 효과에 관한 Housemarque의 주요 원칙 중 하나는 가능한 많은 부분을 실시간으로 표현하고 미리 준비한 데이터를 최소한으로 사용하는 것입니다. 이전 타이틀인 Alienation과 Matterfall에서 유체 시뮬레이션을 사용했던 경험을 통해, Returnal에서 미리 준비한 속도 데이터를 사용해서는 안된다는 사실을 처음부터 분명하게 파악할 수 있었습니다.

대신 저희는 플레이어 주위에 실시간 유체 시뮬레이션을 적용하여 입자, 식물, 다른 VFX 요소의 움직임에 영향을 미치는 공기의 흐름을 표현했습니다. 이 시뮬레이션 외에도 게임의 다른 인물들에게 추가적인 시뮬레이션을 적용했습니다.

모든 게임플레이 이벤트에서 유체 시뮬레이션에 힘을 추가하여 인근 VFX 요소가 반응하게 만들 수 있습니다. 예를 들어 적이 점프 어택을 위해 착지하는 애니메이션이 진행될 때, 해당 장면과 지점의 유체 시뮬레이션에 원 형태의 충격을 추가할 수 있습니다. 이를 통해 나뭇잎이나 불꽃과 같은 입자가 충격 지점에서 멀리 날아가게 됩니다. 하단의 영상에서 적의 애니메이션이 일으키는 유체 충격과 플레이어의 액션이 식물 입자에 주는 영향을 확인할 수 있습니다.

식물과 같이 유체의 속도만 사용해도 충분한 사물이 있는 반면, 유체 시뮬레이션으로는 부족한 특별 입자도 존재했습니다. 더 많은 데이터를 위해 특별 입자에 유체 시뮬레이션을 위한 소용돌이 운동 계산을 추가하여 유체 속도의 크기에 비례하는 노이즈 필드를 입자 속도에 추가했습니다. 하단에서 확인할 수 있는 제노 아카이브 홀로그램과 플레이어 순간이동 효과에 이 기법이 활용되었습니다.

복셀라이저와 볼륨메트릭 효과

Returnal의 초반 환경 중에서 저희가 만들고 싶었던 요소는 두껍고 부피가 큰 안개였습니다. 레벨의 다양한 높이 때문에 절차적으로 안개를 생성하는 일은 문제가 있었습니다. 대신 저희는 안개의 부피를 수작업으로 설정하기로 했습니다. 환경팀이 준비한 많은 양의 안개 부피를 바탕으로 제작 과정을 가능한 간단하게 만들고자 했습니다.

유연한 파티클 시스템을 통해 이러한 부피들을 NGP로 제작할 수 있었습니다. 입자 데이터와 행동을 완벽하게 설정할 수 있기 때문에 여러 입자에 3차원 인덱스를 저장하고 부피를 표현하도록 했습니다. 부피 범위는 CPU에서 NGP로 이동하는 데이터가 됩니다. 3차원 인덱스에 더해 3D 화소에 다른 데이터도 저장할 수 있으며, 이를 통해 부피 내에 3D 화소의 다양한 상태를 저장하게 되었습니다. 3D 화소의 상태 저장 외에도 게임 속 세계나 부피 내의 위치를 기반으로 로직을 업데이트할 수도 있었습니다.

3D 화소가 상태와 위치를 인식하지만, 자동으로 문이나 벽 같은 표면 근처에서는 밀도를 높이고 부피의 경계 근처에서는 사라지도록 만들 수 있었습니다. 이를 통해 주변 환경에 따라 자동적으로 안개가 조정되기 때문에 안개의 부피를 설정하는 작업 과정을 단축시켰습니다. 그리고 3D 화소 위치에 유체 시뮬레이션을 적용하여 바람, 총알, 플레이어 액션 같은 것들이 안개를 움직이도록 했습니다. 아래의 영상에서 레벨에 배치된 NGP 안개를 확인할 수 있습니다. 안개의 밀도는 표면 근처에서만 높아지며 유체 시뮬레이션의 영향을 받게 됩니다.

이를 모두 활용한 프리케 보스전 제작

프리케와 조우할 때 프리케의 뼈대 메시에서 볼륨메트릭 안개를 발생시키고 싶었습니다. 볼륨메트릭 안개와 뼈대 메시는 각각 다른 요소에서 만들어지기 때문에 이 방법은 문제가 있었습니다. 뼈대 메시는 꼭지점의 집합체이며, 렌더링할 수 있도록 삼각형을 구성하는 3D 공간의 애니메이션 좌표입니다. 꼭지점은 나무부터 인간형 로봇까지 모든 형태를 만들 수 있습니다. 반면에 볼륨메트릭 안개는 부피라고 부르는 네모난 상자를 사용합니다. 이러한 부피는 작은 요소인 3D 화소로 이루어져 있습니다. 뼈대 메시와는 반대로, 언리얼 엔진에서 안개 부피는 항상 네모난 상자 형태를 갖고 있습니다.

프리케의 꼭지점들이 볼륨메트릭 안개를 내뿜도록 만들고 싶다면, 뼈대 메시가 안개 속의 어떠한 3D 화소를 포함하고 있는지 알아내야 했습니다. 이는 사소한 부분이었지만 진짜 문제는 하나의 3D 화소가 꼭지점 한 개만 처리할 수 있다는 점이었습니다. 2개의 꼭지점이 같은 3D 화소를 점유하게 되면 예상치 못한 결과나 충돌이 발생하게 됩니다. 더욱이 하나의 3D 화소 안에 한 개의 꼭지점 대신 여러 개의 꼭지점이 포함될 확률이 높은 상황이었습니다.

이에 대한 해결책은 실시간 복셀라이저였습니다. 복셀라이저는 뼈대 메시를 입력하여 부피를 산출하고 뼈대 메시 안에 있는 3D 화소를 점유되었다고 표시합니다. 이로 인해 안개 분출 제작 과정이 더욱 간단하게 변하며, 복셀라이저의 결과물만 확인하고 3D 화소가 점유 상태인지 아닌지를 보면 되었습니다. 하단 영상에서 프리케의 메시를 입력 요소로 활용한 복셀라이저의 결과물을 확인할 수 있습니다.

프리케의 메시에서 안개를 분출하는 기능을 활용하여 프리케가 이동할 때 캐릭터가 환경과 더욱 잘 어울리도록 만들 수 있었습니다. 그리고 안개 속에 중간 과정을 숨길 수 있기 때문에 순간이동이나 산출 같은 프리케의 특수 액션을 쉽게 만들 수 있었습니다. 아래의 비교 영상을 통해 볼륨메트릭 안개 및 기타 효과가 있을 때와 없을 때의 프리케 산출 장면을 확인할 수 있습니다.

이것으로 Returnal 시각 효과에 대한 심층 분석을 마무리하겠습니다. 재미있는 시간이었기를 바라며 차후에 다른 기법과 기술을 공유하고자 합니다.

※ 게임 및 콘텐츠의 출시일은 국가/지역별로 상이할 수 있습니다.
※ 해당 내용은 사전 안내 없이 변경될 수 있습니다.

대화에 참가하기

댓글 달기

댓글을 달기 전에

다같이 즐겁게 이야기할 수 있도록 친절하고 배려하는 댓글 달기에 힘써주세요.

댓글 남기기