본문 바로가기
상상발전소/콘텐츠이슈&인사이트

작업 유형별 리얼타임 엔진 적용 방법

by KOCCA 2022. 12. 15.

많은 애니메이션, 영화 등 다양한 미디어 영상에 나오는 아름다운 해변, 숲 등 실제로 찍은 듯한 아름다운 장면들이 나오는데요. 이런 장면들은 그 장소에 직접 가서 찍은 것이 아니라, 리얼타임 엔진을 사용하여 실제같이 만든 가상현실입니다.

 

오늘은 작업 유형별 리얼타임 엔진 적용 방법에 대해서 알아보겠습니다!


캐릭터

캐릭터는 애니메이션에서 가장 중요한 핵심 에셋입니다. 그런 만큼 프로젝트에 따라서 다양한 방식으로 제작되고 있습니다. 기본적인 스킨 웨이트(skin weight) 작업에 블렌드 셰이프 (blend shape) 마야(Maya)의 래티스(Lattice)를 이용한 디폼(deform), 다양한 시뮬레이션을 이용한 소프트 바디나 클로스(cloth) 시뮬레이션, 헤어(hair)나 퍼(fur)까지 DCC툴에서 사용 가능한 수많은 방법이 사용되고 있습니다. 하지만 리얼타임 엔진에서는 실시간으로 렌더링 하기 위해 렌더링 파이프라인이 극단적으로 최적화되어 있기 때문에 기본적으로 스킨 웨이트와 블렌드 셰이프 외에는 DCC툴과의 호환성을 유지하지 않습니다.

출처 : 유튜브

스킨 웨이트와 블렌드 셰이프를 가진 캐릭터 데이터는 오토데스크(Autodesk)의 FBX 포맷을 이용하여 DCC툴에서 리얼타임으로 보낼 수 있습니다. FBX 포맷으로는 기존의 애니메이션 공정대로 만든 캐릭터 데이터를 사용할 수 없기 때문에 많은 애니메이션 스튜디오들이 알렘빅(Alembic) 포맷을 이용하고 있습니다. 알렘빅 포맷은 버텍스(vertex) 정보를 그대로 전달하기 때문에 DCC툴에서 어떠한 방법으로 제작되었든 간에 최종 결과물을 리얼타임 엔진으로 전달할 수 있습니다. 하지만 알렘빅 포맷은 프로그램이나 엔진에 따라 호환성을 100% 보장하지 않고 파일 용량이 극단적으로 높아지며 리얼타임 엔진으로 가져와도 데이터를 가공하는 것이 불가능하다는 한계가 있습니다.


해어와 퍼

리얼타임 엔진에서 헤어(hair)와 퍼(fur)는 성능 문제를 피하기 위해 카드 메시(Card mesh)를 이용하여 제작하는 것이 일반적이었습니다. 하지만 언리얼 엔진에서는 스트랜드(strand) 기반의 헤어와 퍼를 시뮬레이션 및 렌더링하는 것이 가능하여 더욱 사실적이고 다양한 헤어를 사용할 수 있게 되었습니다. 헤어와 퍼 데이터를 언리얼 엔진으로 가져오기 위해서는 알렘빅 포맷을 이용합니다. 이때 가이드 스트랜드를 지정하거나 UV 정보를 같이 가져오기 위해서는 마야에서 스크립트를 이용하여 해당 정보를 알렘빅 파일에 포함해야 합니다.


리깅

리깅은 전통적인 제작 방식과 리얼타임 엔진에서의 제작 방식이 서로 달라 현재는 많은 스튜디오들이 DCC툴에서 제작한 리깅된 본을 굽는(baking) 과정을 거쳐 키 애니메이션으로 변환해서 사용합니다. 릭(rig) 역시 FBX 포맷을 이용하여 리얼타임 엔진으로 가져올 수 있는데 이때 DCC툴의 컨트롤러가 리얼타임 엔진에서는 인식되지 않거나 일반 계층으로 인식되기 때문에 FBX로 익스포트(export)할 때 실제 리깅된 본을 사용하지 않고 리깅된 본을 그대로 따라다니는 익스포트 전용 본을 만들고 이 본들을 구워서 익스포트하게 됩니다.

 

언리얼 엔진에서는 컨트롤 릭이라는 시스템을 도입하여 실시간 릭을 제작할 수 있게 되었고 이전 작업 공정에서 좀 더 쉽고 편하게 리얼타임 엔진을 도입할 수 있도록 FBX 포맷을 이용하여 마야의 컨트롤러들을 그대로 컨트롤 릭의 컨트롤러들에 적용할 수 있도록 기능을 제공하고 있습니다.


애니메이션

언리얼엔진을 사용한 애니메이션 ‘다이노파워즈’ / 출처 : DINOPOWERS 유튜브

니메이션 데이터는 캐릭터 데이터와 마찬가지로 FBX 포맷과 알렘빅 포맷을 이용하여 리얼타임 엔진으로 가져올 수 있습니다. 일반적인 본 애니메이션이나 커브 데이터들은 FBX 포맷을 이용하고 복잡한 버텍스 시뮬레이션 결과나 FBX로 전달할 수 없는 버텍스 애니메이션들은 알렘빅 포맷을 이용하여 데이터를 전달합니다. 애니메이션 데이터의 경우 리얼타임 엔진으로 가져올 때 기본적으로 압축하도록 되어 있기 때문에 본들 사이의 거리가 너무 멀면 오차가 발생합니다. 일반적으로 리얼타임 엔진에서는 애니메이션의 루트가 캐릭터를 기준으로 하도록 제작되는 데 반해 애니메이션 제작 공정에서는 애니메이션의 루트가 월드상의 중점을 기준으로 하기 때문에 부각되는 문제로, 이때는 애니메이션 데이터를 압축하지 않으면 해결됩니다.


리얼타임을 도입하기 시작한 초창기에는 DCC툴에서 배경을 구성한 뒤에 이미 배치된 배경 프롭(prop)들을 배치된 위치와 방향, 크기를 가지고 그대로 리얼타임 엔진으로 전달하는 방법을 사용했습니다. 하지만 리얼타임 엔진에서는 훨씬 많은 프롭들을 최종 결과에 가까운 퀄리티로 뷰포트에서 실시간으로 배치하고 구성할 수 있는데 이러한 과정을 DCC툴에서 진행하고 리얼타임 엔진으로 단순히 옮기는 작업 공정은 리얼타임 엔진이 가지는 장점을 살리지 못합니다. 따라서 최근에는 각각의 정렬된 프롭들을 리얼타임 엔진에 가져오고 리얼타임 엔진의 뷰포트에서 배경을 조립하는 방식을 사용하는 스튜디오들이 늘어나고 있습니다.

출처 : Inio Asano/Shogakukan

 

리얼타임 엔진의 도입은 배경의 제작 방식과 규모에도 변화를 주고 있습니다. DCC툴에서는 뷰포트 성능의 문제로 컷에 맞춰 배경을 수정하고 각각 별개의 조그만 배경으로 사용하게 됩니다. 때문에 프리비즈 단계에서 결정한 레이아웃이 최종 결과에서 의도대로 나오지 않은 경우에 수정하기가 쉽지 않습니다. 하지만 리얼타임 엔진에서는 DCC툴에 비해 훨씬 넓은 배경을 실시간으로 렌더링할 수 있기 때문에 여러 컷을 하나의 레벨에서 작업하는 것이 가능합니다. 이를 통해 최종 출력 직전까지도 원하는 대로 컷의 레이아웃을 수정할 수 있고 이를 통해 퀄리티를 높일 수 있습니다. 또한 레벨을 수정하는 경우에도 이전 방식에서는 컷 파일마다 모두 개별적으로 수정을 해야 하지만 리얼타임 엔진에서는 하나의 레벨을 수정하는 것으로 모든 컷에 영향을 줄 수 있습니다.


머티리얼

모델링이나 애니메이션 같은 에셋을 만드는 기본 작업은 대부분 DCC툴을 통해서 이뤄지지만 머티리얼(material)의 경우에는 리얼타임 엔진을 도입한다면 리얼타임 엔진에서 처음부터 만들어야 합니다. 많은 스튜디오들이 이미 DCC툴의 머티리얼이나 셰이더(shader) 라이브러리를 구축하고 있기 때문에 리얼타임 엔진을 도입할 때 가장 곤란한 점이 바로 머티리얼이라고 할 수 있습니다.

 

리얼타임 엔진은 물리 기반 렌더링(PBR)을 도입하고 있기 때문에 기존의 재질을 표현하기 위해 사용하던 텍스처들도 제작 방식이나 종류가 보통 DCC툴과는 다릅니다. 예를 들면 전통적인 애니메이션 작업 공정에서는 일반적으로 스페큘러(Specular) 맵을 이용하지만 PBR에서는 현실에서의 재질 특성을 표현하도록 메탈릭(Metallic) 맵과 러프니스(Roughness) 맵을 사용하기 때문에 기존의 맵을 그대로 사용할 수 없습니다. 프리비즈에서만 리얼타임 엔진을 사용하는 경우에는 상관없지만 렌더러로 사용한다면 머티리얼은 엔진에 맞게 라이브러리를 다시 구축해야 합니다.


카메라

리얼타임 엔진도 카메라를 제공하고 카메라를 애니메이팅하기 위한 키 프레임 작업도 지원합니다. 하지만 아직까지 많은 스튜디오들은 DCC툴에서 카메라를 애니메이팅하고 카메라의 키 데이터를 FBX 포맷을 이용하여 리얼타임 엔진의 카메라에 그대로 적용하는 방식을 사용하고 있습니다. 리얼타임 엔진과 DCC툴 간의 키 데이터 보관 방식의 차이로 인해 움직임에서 미묘한 차이가 발생하기도 하고, 근본적으로 DCC툴을 이용한 다양한 카메라 세팅 방법을 리얼타임 엔진에서는 그대로 사용할 수 없기 때문에 작업 효율도 떨어지기 때문입니다.

출처 : Ncam Reality FX and RealDepth to create a real – time virtual studio

이 방법에도 한계는 있는데 대표적인 것은 리얼타임 엔진의 카메라 세팅 값의 종류가 DCC툴의 카메라와 완전히 일치하지 않는다는 점입니다. 예를 들면 DCC툴 카메라의 포컬렝스(Focal Length)와 리얼타임 엔진 카메라의 필드 오브 뷰(Field of view)가 서로 완전히 일치하지 않는다든지, DCC툴 카메라의 카메라 애퍼처(Camera Aperture)에 대응하는 리얼타임 엔진 카메라의 값이 없다든지 하는 경우입니다. 여기에 더해 FBX 포맷이 지원하지 않는 카메라 속성 값도 존재해서 카메라 데이터를 FBX 포맷으로 가져오더라도 동일하게 보이지 않는 문제가 발생하게 됩니다. 이를 해결하기 위해 플러그인을 이용하거나 DCC툴의 커스텀 어트리뷰트(Custom Attribute)를 이용하여 필요한 카메라 수치를 커브(curve) 데이터로 전달하는 방법을 사용합니다.

 

언리얼 엔진에서는 이러한 문제를 해결하기 위해 시네카메라 액터를 제공합니다. 이 카메라는 DCC툴과 동일한 작동 방식과 속성 종류를 가지고 있기 때문에 기존의 리얼타임 카메라가 갖는 한계를 상당 부분 개선하고 있습니다.


라이팅

렌더러로 리얼타임 엔진을 사용하는 경우라면 라이팅 역시 리얼타임 엔진이 지원하는 라이트(light)를 이용하여야 합니다. DCC툴과 전혀 호환성이 없기 때문에 DCC툴에서 작업된 라이트를 가져오는 것은 불가능합니다. DCC툴과 달리 리얼타임 엔진은 뷰포트에서도 최종 결과물과 비슷한 라이팅 결과를 보여주기 때문에 훨씬 작업이 편리하고 이터레이션 (iteration)을 통한 퀄리티 향상이 유리합니다. 언리얼 엔진에서는 라이트 모빌리티를 스태틱 (static), 스테이셔너리(stationary), 다이내믹(dynamic) 3가지 제공하는데, 레벨의 유형이나 렌더링 방식에 따라 적절한 모빌리티를 선택하여야 합니다. 라이트맵을 빌드하는 경우라면 스태틱 라이트를 사용하여 라이트를 성능 저하 없이 원하는 대로 추가하는 것이 가능합니다.

 

레이트레이싱이나 패스 트레이서 방식으로 렌더링한다면 다이내믹 라이트를 사용하여야 하는데 이때 라이트 수가 늘어나면 뷰포트의 속도는 떨어지게 됩니다.


컷 구성 및 편집

리얼타임 엔진에서는 앞서 언급한 다양한 에셋들을 배치하고 애니메이션을 적용하기 위해 비선형 편집 툴을 제공합니다. 이러한 비선형 편집 툴은 사운드나 이펙트 적용과 같은 포스트 프로세스 공정까지도 가능하기 때문에 전체적인 작업 공정을 줄일 수 있습니다. 단순한 애니메이션뿐만 아니라 게임엔진 특성상 다양한 이벤트도 작동할 수 있기 때문에 캐릭터가 걷거나 달릴 때 발이 땅에 닿으면서 발생하는 이펙트나 사운드를 자동으로 생성할 수도 있고 배경의 문이 열리거나 오브젝트가 움직이는 애니메이션도 매번 키 데이터를 만들지 않고 미리 만들어 놓은 뒤에 이벤트를 통해 재활용할 수 있습니다.

 

언리얼 엔진에서는 시퀀서라는 편집툴을 이용하여 하나의 컷을 구성하는 것은 물론 다수의 컷과 테이크를 영상 편집 툴처럼 편집하는 것도 가능합니다.


렌더링

출처 : Unreal Engine KR

리얼타임 엔진에서는 기본적으로 렌더링 속도를 높이기 위해 화면을 렌더링할 때 근사적인 처리를 많이 사용하게 됩니다. 하지만 이런 방식은 높은 퀄리티를 요구하는 애니메이션 작업에 적합하지 않고, 때문에 리얼타임 엔진을 애니메이션 작업에서 렌더러로 사용하는 것이 쉽지 않았습니다. 언리얼 엔진은 기본적인 렌더링 퀄리티가 높아서 그대로 애니메이션에 사용 가능한 수준의 결과를 제공하지만 더 정교한 GI(Global Illumination)나 라이팅 결과가 필요한 경우 레이트레이싱이나 패스 트레이서를 통해 이 문제를 해결하고 있습니다.

 

레이트레이싱이나 패스 트레이서는 광원에서 광자(photon)를 방출하고 이 광자의 궤적을 추적하여 물리적으로 정확한 렌더링 결과를 제공하는 방식입니다. 기본 개념은 이전의 오프라인 렌더러와 동일하지만 하드웨어 가속과 전용 API를 통해 레이트레이싱은 리얼타임으로 렌더링되고 패스 트레이서는 오프라인 렌더링 퀄리티를 훨씬 빠른 속도로 제공한다는 차이가 있습니다.

 

레이트레이싱이나 패스 트레이서는 옵션 수치를 너무 높이면 뷰포트가 느려져서 작업하는 데 문제가 있기 때문에 뷰포트 작업에서는 옵션 수치를 낮추거나 아예 비활성화하여 기존의 리얼타임 렌더링 방식을 사용하고 최종 결과물을 렌더링 할 때만 무비 렌더 큐의 콘솔 변수(Console Variable)를 이용하여 원하는 수준으로 퀄리티를 높이는 방식을 사용합니다.

 

이런 방식의 작업이 가능한 것은 언리얼 엔진의 경우 레이트레이싱이나 패스 트레이서의 옵션 수치를 충분히 낮추거나 사용하지 않더라도 최종 결과물과 크게 차이 나지 않는 뷰포트 렌더링 퀄리티를 가지고 있기 때문입니다.

 

이 글은 한국콘텐츠진흥원의 ‘2021 애니메이션 산업백서’에 게재된 글을 활용하였습니다.