군중 애니메이션: 도시 샘플 플러그인으로 쉽게 따라하기

[게임] 군중 애니메이션: 도시 샘플 플러그인으로 쉽게 따라하기 | 언리얼 서밋 온라인 2022 - YouTube

1. VAT (Vertex Animation Texture)

Untitled

Vertex Animation Texture란 스켈레톤이 없는 스태틱 메시를 애니메이팅 하기 위해 애니메이션 시퀀스에서 메시의 각 정점의 정보를 샘플링하여 그 값을 기록한 텍스처. 이 텍스처에는 프레임별 모든 정점의 트랜스폼이 저장되어 있으며, 텍스처의 width가 정점의 개수, height가 애니메이션 프레임의 길이가 된다. 이 텍스처를 머티리얼에서 World Position Offset을 사용하여 정점을 변환시킴으로써 애니메이션을 재생한다.

  1. 텍스처로 애니메이션을 적용하면 기존 방식보다 가벼운 이유가 무엇인지?

    기존 애니메이션 방식은 Bone hierarchy 구조가 존재하며 이를 CPU에서 연산한다. 일단 CPU가 관여한다는 시점에서부터 속도가 느려진다. 그리고 서로 연결된 본끼리의 포지션과 로테이션 값을 연산하는 것은 종속성을 가지므로 병렬화를 하는 것이 불가능하다.

    animation texture는 베이킹되는 과정에서 스켈레톤의 최종 오브젝트 포지션을 전부 계산하여 결과값을 저장하기에 많은 매트릭스 연산이 베이킹 시점에 이루어지고 그렇기에 병렬화가 가능한 상태가 된다. 이를 GPU에서 셰이더(머티리얼)만을 이용하여 실행시키므로 CPU 병목이 없기에 성능 향상을 기대할 수 있다.

    하지만 IK나 Physics와 같은 런타임에 bone의 위치를 결정해야하는 경우 이런 방법은 사용할 수 없다. texture가 만들어지고 그것을 실행시키는 시점에서 이미 bone hierarchy가 전부 없어지기에 사실상 런타임에 애니메이션에 변화를 주는게 거의 불가능한 상태가 된다. 부분적으로 애니메이션 블렌딩을 구현하여 해소할 수도 있다. 그리고 서로 같은 구조의 스켈레탈 메시의 경우 같은 애니메이션 데이터를 사용할 수 있다.

<aside> 💡 RHIT(Rendering Hardware Interface Thread)

RHIT는 렌더링 API와 상호작용하여 그래픽 카드와 통신하고 렌더링 명령을 발행하는 역할을 한다.

RHIT는 여러가지 렌더링 API (e.g. DirectX 12, Vulkan)를 지원하며, 해당 API를 사용하여 그래픽 카드의 기능을 활용하여 실시간 그래픽스를 처리한다. RHIT는 GPU와의 효율적인 통신을 위한 저수준 인터페이스를 제공하며, 그래픽스 파이프라인을 구성하고 제어하는데 필요한 명령을 생성하고 실행한다.

UE5의 RHIT 시스템은 렌더링 API의 일부로써, 그래픽스의 높은 성능과 효율성을 추구하며, 다양한 플랫폼 및 하드웨어에 대한 호환성을 제공한다. RHIT는 UE5의 새로운 렌더링 아키텍처인 “Nanite” 및 “Lumen”과 같은 기술을 구현하는데 사용된다.

일반적으로 게임 개발자는 RHIT를 직접 다룰 필요는 없으며, 대부분의 렌더링 작업은 UE5의 렌더링 시스템 및 고수준 API (e.g. UMG, Material)를 사용하여 처리된다. 그러나 일부 특정한 작업이 필요한 경우에는 RHIT에 접근하여 원하는 기능을 구현할 수도 있다.

</aside>

2. AnimToTexture 플러그인

Untitled

Vertex 방식과 bone 방식 모두 지원한다.

Bone은 vertex 방식보다 퍼포먼스를 더 사용하지만 각 버텍스마다 애니메이션을 저장하는 것이 아니라 본으로 묶어서 저장하기 때문에 훨씬 더 적은 텍스처를 사용한다. 그리고 같은 스켈레톤 구조를 가지는 캐릭터의 경우 AT 하나만 만들면 여러 캐릭터에서 함께 사용이 가능하다. 결국 vertex가 많은 복잡한 캐릭터일 경우에 bone 방식이 유용하다. 게다가 한 텍스처에 여러 애니메이션들을 함께 베이크해서 원하는 애니메이션만 재생시킬수도 있다. 그리고 여러개의 LOD 메시들도 추가할 경우 UV 정보만 깨지지 않는다면 기존 애니메이션 텍스처 그대로 사용이 가능하다.

Untitled

Untitled

텍스처의 width는 bone의 개수, height는 애니메이션 프레임 길이다.

텍스처의 width는 bone의 개수, height는 애니메이션 프레임 길이다.

Untitled

Untitled

Vertex 방식에서는 버텍스 수가 많아지면 텍스처가 커질 수 밖에 없다. 하지만 vertex 방식이 bone 방식보다 가볍긴 하다.

3. Vertex Animation을 적용한 캐릭터 제작 파이프라인

  1. AnimToTexture 플러그인 설치 및 활성화