나이아가라 디자인 철학
언리얼 엔진의 비주얼 이펙트 기능을 재편하는 이유
언리얼 엔진은 사용자 기반을 넓히고 있으며, 현재 게임 개발 이외에도 다양한 산업에서 활용되고 있습니다. 예시는 다음과 같습니다.
- 건축 시각화
- 자동차 디자인 등 산업 디자인
- 가상 TV 및 영화 제작
디자인을 공부하는 학생부터 소규모 인디 개발자, 대규모 전문 스튜디오 팀, 게임 외 업계의 개인 및 회사까지, 그 어느 때보다 사용자가 다양해졌습니다. 에픽이 발전하면서 저희 개발자들은 어떤 산업에서 언리얼 엔진을 사용하는지 완벽하게 이해하지는 못합니다. 에픽게임즈는 모든 산업의 사용자들이 사용할 수 있는 효과적인 비주얼 이펙트(VFX) 시스템을 만들고자 합니다.
새로운 VFX 시스템의 목표
에픽게임즈의 새 시스템에서 모든 사용자들이 필요한 이펙트를 생성할 수 있도록 유연성을 더하고 싶었습니다. 새로운 VFX 시스템의 목표는 다음과 같습니다.
- 아티스트가 모든 요소를 제어할 수 있습니다.
- 모든 측면에서 프로그래밍하고 커스터마이징할 수 있습니다.
- 디버깅, 시각화 및 퍼포먼스에 더 뛰어난 툴이 있습니다.
- 언리얼 엔진의 다른 곳이나 외부 소스에서 가져온 데이터를 지원합니다.
- 사용자 편의를 향상시킵니다.
나이아가라로 목표를 달성한 방법
데이터 공유
완전한 사용자 컨트롤은 데이터 액세스에서부터 시작합니다. 에픽게임즈는 사용자가 다른 애플리케이션의 데이터는 물론이고, 언리얼 엔진의 모든 데이터를 활용할 수 있기를 바랍니다. 따라서 모든 데이터를 사용자에게 공개하기로 했습니다.
파티클 페이로드
사용자에게 이 데이터를 모두 공개하려면, 이 데이터가 어떻게 사용될지를 먼저 정해야 합니다. 네임스페이스는 계층형 데이터의 컨테이너 역할을 합니다. 예를 들어 Emitter.Age에는 이미터 데이터가 있고, Particle.Position에는 파티클 데이터가 있습니다. 파라미터 맵은 파티클의 모든 어트리뷰트를 보유한 파티클 페이로드입니다. 이로써 모든 요소를 선택할 수 있게 됩니다.
여러 타입의 데이터 추가 가능
어떤 타입의 데이터든 파티클 파라미터로 추가할 수 있습니다. 복잡한 구조체나 트랜스폼 매트릭스, 부울 플래그를 추가할 수 있습니다. 데이터의 타입과 관계없이 추가한 뒤 이펙트 시뮬레이션에 사용할 수 있습니다.
그래프 패러다임과 스택 패러다임 결합
캐스케이드에 사용되는 스택 패러다임과 블루프린트에 사용되는 그래프 패러다임은 둘 다 이점이 있습니다. 스택은 가독성이 뛰어나며 사용자가 모듈에 따라 행동할 수 있게 합니다. 그래프를 사용하면 사용자가 행동을 더 제어할 수 있습니다. 새로운 이펙트 시스템은 두 가지 패러다임의 이점을 결합했습니다.
나이아가라의 하이브리드형 계층구조
모듈
모듈은 그래프 패러다임으로 작동합니다. 스크립트 에디터에서 비주얼 노드 그래프를 사용하여 HLSL을 포함하는 모듈을 생성할 수 있습니다. 모듈은 공통 데이터와 통신하고 동작을 캡슐화하며 다른 모듈과 중첩됩니다.
이미터
이미터는 스택 패러다임으로 작동합니다. 모듈의 컨테이너 역할을 하며, 중첩되어 다양한 이펙트를 생성합니다. 이미터는 단일 용도이며 재사용 가능합니다. 파라미터는 모듈의 이미터 레벨까지 전송되지만 이미터에서 모듈과 파라미터를 수정할 수 있습니다.
시스템
이미터와 마찬가지로 시스템은 스택 패러다임으로 작동하고, 시스템의 이미터 동작을 제어하는 데 사용할 수 있는 시퀀서 타임라인에서도 작동합니다. 시스템은 이미터의 컨테이너로, 이미터들을 하나의 이펙트로 결합합니다. 나이아가라 에디터에서 시스템을 편집할 때 시스템에 있는 임의의 파라미터, 모듈, 이미터를 수정하거나 오버라이드할 수 있습니다.
나이아가라 선택 스택 및 스택 그룹
나이아가라의 파티클 시뮬레이션은 스택처럼 작동하는 개념입니다. 시뮬레이션이 스택 상단에서 하단으로 흐르고, 순서대로 모듈을 실행합니다. 결정적으로, 모든 모듈이 모듈 실행 시기를 설명하는 그룹에 할당됩니다. 파티클을 초기화하거나 파티클 스폰(Particle Spawn) 그룹에 파티클이 스폰될 때 작동하는 모듈을 예로 들 수 있습니다.
각 그룹 내에는 시스템의 라이프 사이클에 있는 특정 지점에서 호출되는 여러 개의 스테이지(stage) 가 있을 수 있습니다. 모든 이미터, 시스템, 파티클에는 기본적으로 스폰(Spawn) 및 업데이트(Update) 스테이지가 있습니다. 스폰 스테이지는 그룹이 존재하는 첫 번째 프레임에서 호출됩니다. 예를 들어 레벨에서 처음 인스턴스화된 시스템이 활성화되면, 시스템은 스폰 스테이지를 호출합니다. 파티클은 이미터가 파티클을 내보낼 때마다 스폰 스테이지를 호출하고, 생성된 파티클마다 스폰 인스트럭션이 실행됩니다. 업데이트 스테이지는 시스템이나 이미터, 또는 파티클이 활성 상태인 모든 프레임에서 호출됩니다.
이벤트(Events) , 시뮬레이션 스테이지(Simulation Stages) 와 같이 스폰 및 업데이트 흐름에 추가할 수 있는 고급 스테이지도 있습니다. 이벤트 는 파티클이 새 이벤트를 생성하고 이미터가 해당 이벤트를 처리하도록 설정될 때마다 호출됩니다. 가능한 경우 이벤트 핸들러 스테이지는 동일한 프레임에서, 기존 이벤트 이후에 발생합니다. 시뮬레이션 스테이지 는 고급 GPU 기능입니다. 이 기능으로 여러 스폰 및 업데이트 스테이지를 순차적으로 발생시킬 수 있으며, 유체 시뮬레이션 같은 복잡한 구조를 생성하는 데 유용합니다.
모듈은 아이템이지만 아이템은 모듈이 아닙니다. 모듈(Modules) 은 사용자가 생성할 수 있는 편집 가능 에셋입니다. 아이템(Items) 은 사용자가 생성할 수 없는 시스템 또는 이미터의 일부입니다. 아이템의 예시로는 시스템 프로퍼티, 이미터 프로퍼티, 렌더러가 있습니다.
스테이지, 그룹, 네임스페이스, 데이터 캡슐화
(시스템, 이미터, 파티클) 그룹 의 (업데이트, 스폰, 이벤트, 시뮬레이션) 스테이지 에 각 모듈을 추가하여 모듈 실행 시기와 모듈에서 작업하는 데이터를 제어할 수 있습니다. 스택 그룹은 해당 그룹의 모듈이 읽고 쓸 수 있는 데이터를 정의하는 네임스페이스(Namespaces) 와 연결됩니다.
예를 들어 시스템(System) 그룹에서 실행되는 모듈은 시스템 네임스페이스의 파라미터에서 읽고 쓸 수 있지만, 엔진 또는 사용자 네임스페이스에 속하는 파라미터는 읽을 수만 있습니다. 시스템 그룹의 스택에서 이미터 그룹으로 실행이 진행될 때 이미터(Emitter) 그룹에서 실행되는 모듈은 이미터 네임스페이스의 파라미터를 읽고 쓸 수 있지만, 시스템, 엔진 및 사용자 네임스페이스의 파라미터는 읽을 수만 있습니다. 파티클(Particle) 그룹의 모듈은 시스템 및 이미터 네임스페이스의 파라미터에서 읽기가 가능합니다.
이미터 그룹의 모듈이 시스템 네임스페이스의 파라미터를 읽을 수 있으므로 모든 이미터와 관련이 있는 시뮬레이션을 시스템 그룹의 모듈에서 한 번만 실행할 수 있습니다. 실행 결과는 시스템 네임스페이스에 저장되며 개별 이미터의 이미터 그룹 모듈에서 읽을 수 있습니다. 이에 따라 파티클 그룹 모듈에서는 시스템 및 이미터 네임스페이스의 파라미터를 읽을 수 있습니다. 아래 표에서 이러한 관계를 간략히 보여줍니다.
모듈 그룹 | 네임스페이스 읽기 | 네임스페이스 쓰기 |
---|---|---|
시스템 | 시스템, 엔진, 사용자 | 시스템 |
이미터 | 시스템, 이미터, 엔진, 사용자 | 이미터 |
파티클 | 시스템, 이미터, 파티클, 엔진, 사용자 | 파티클 |