포트나이트 배틀로얄 챕터 4에 나나이트 도입

Graham Wihlidal, 에픽게임즈의 엔지니어링 펠로우, 그래픽 |
2023년 1월 26일
안녕하세요, 에픽게임즈의 엔지니어링 펠로우(그래픽) 그레이엄 윌리달(Graham Wihlidal)입니다. 올해 포트나이트 배틀로얄 챕터 4에 나나이트를 도입하기 위해 개발한 흥미로운 기능과 향상된 점을 소개합니다. 이러한 기능은 언리얼 엔진 5.1에서 베타 버전으로 사용할 수 있습니다.

나나이트는 언리얼 엔진 5.0에서 정식 버전으로 출시되었습니다. 나나이트에는 이미 유용한 기능이 많았지만, 초기 버전에서는 비나나이트 메시에 사용할 수 있는 많은 기능을 완전히 지원하지는 못했고 대신에 핵심 나나이트 기능을 다듬는 데 집중했습니다.

앞으로는 나나이트에서 아직 지원하지 않는 여러 영역으로 지원을 넓히고자 합니다. 사용자들은 월드 포지션 오프셋, 픽셀 뎁스 오프셋, 커스텀 UV, 양면 머티리얼, 마스크드 머티리얼 같은 기능에 대한 지원을 강력히 요청했습니다. 올해 초, 저희 팀은 이러한 기능 중 일부에 대한 지원을 구현하기로 했고, 그로 인해 중대한 문제를 많이 해결해야 했습니다.

GPU는 일명 고정 함수 파이프라인으로 시작되었습니다. 이 파이프라인의 경우 지오메트리의 트랜스폼 방식이나 뎁스 및 컬러 작성 방식이 하드웨어에 빌드되어 제한적인 사전 정의 함수 세트로만 환경설정할 수 있었습니다. 이후 하드웨어는 셰이더 코드를 통해 ‘프로그래밍 가능’하게 되었습니다. 이로 인해 그래픽에 대한 새로운 가능성이 열렸고 고정 함수 파이프라인 사용으로는 불가능했거나 어려웠던 기능을 사용할 수 있게 되었습니다.

나나이트는 시작부터 출력 컬러를 제어하는 ‘프로그래밍 가능한’ 머티리얼 그래프 셰이더를 항상 지원해 왔지만, 화면에서의 버텍스 위치와 트라이앵글이 커버하는 픽셀을 결정하는 래스터라이저 자체는 사실상 ‘고정 함수’였습니다. 여전히 셰이더 코드로 구현되었지만 콘텐츠 크리에이터가 로직을 전혀 제어할 수 없었습니다.

앞서 말한 기능을 나나이트에서 지원하기 위해 스스로 프로그래밍 가능한 래스터라이저를 만들어야 했습니다.

초기 프로토타입

저희는 래스터라이저에서 머티리얼 그래프 로직을 지원하는 데 필요한 아키텍처의 프로토타입을 만들기 시작했고, ‘나나이트 프로그래밍 가능한 래스터라이저’라는 이름을 붙였습니다.

다음 이미지는 나나이트 청소 트럭 메시를 애니메이팅하는 마스크드 머티리얼의 초기 프로토타입입니다.
 
프로토타입은 프로그래밍 가능한 래스터라이저의 가능 여부를 입증하는 데는 성공했지만, 효율적인 정식 버전을 만들려면 많은 작업이 남아 있었습니다.

따라서 작업의 진전을 위해 몇 가지 분명한 목표를 정의했습니다.
  • 기존 ‘고정 함수’ 빠른 경로의 퍼포먼스 프로파일을 유지하고, 프로그래밍 가능한 래스터라이저 도입으로 기존 콘텐츠 속도가 저하되지 않도록 한다.
  • 유지보수 차원에서 고정 함수 및 프로그래밍 가능한 래스터라이저 경로가 대체로 동일한 코드 경로를 공유하도록 한다.
  • 프로그래밍 가능한 래스터라이저는 많은 콘텐츠에서 자주 사용될 것이므로 간단한 이벨류에이터가 고정 함수 래스터라이저에 비해 속도가 크게 차이나지 않는 퍼포먼스를 제공해야 함을 명심한다.
  • 인스턴스 컬링과 클러스터 컬링 작업은 한 번만 수행한다.
  • 추가 메모리가 GPU 씬과 나나이트에 미치는 영향을 최소화한다.
  • UE 5.1에 프로덕션 기능으로 제공한다.

초기 프로토타입은 씬의 단일 프로그래밍 가능한 머티리얼만을 지원하도록 하드코딩되었기에 다음 단계는 수백 개의 머티리얼로 구성된 실제 게임 씬을 지원할 수 있도록 하는 적절한 래스터라이저 ‘비닝’ 패스였고, 이를 통해 실제 콘텐츠로 테스트할 수 있었습니다.
대부분이 나나이트로 변환된 중세 게임 샷!
나나이트 트라이앵글 시각화
씬의 고유 래스터라이저 ‘빈’ (머티리얼)
중세 게임 테스트 씬도 잘 작동했지만, 나나이트 프로그래밍 가능한 래스터라이저 프레임워크를 게임에 제공할 수 있으려면 많은 최적화 및 기능 작업을 실시해야 했습니다.

극초기에는 포트나이트 배틀로얄 챕터 4에 나나이트를 활용하려는 생각이 확고했지만, 아직 전면적인 도입에 필요한 기능을 지원하지 못했습니다. 불투명 건설 구조물과 같이 간단해 보이는 메시도 피해를 받을 때 ‘바운스’ 이펙트를 애니메이팅하려면 월드 포지션 오프셋이 필요했습니다. 포트나이트는 프로그래밍 가능한 래스터라이저의 첫 사용처가 되었습니다.

포트나이트 사용 사례

애니메이션 프롭

첫 지원 사용 사례는 보조 애니메이션에 월드 포지션 오프셋을 사용하는 간단한 불투명 스태틱 메시입니다. 이러한 프롭은 효율적인 렌더링에 나나이트가 필요하지 않지만, 버추얼 섀도 맵 퍼포먼스가 나나이트 메시를 통해 더 크게 향상되므로 나나이트를 최대한 사용하여 씬의 많은 부분을 렌더링해야 했습니다.


 

 

빌딩

포트나이트에서 중요한 요소 중 하나는 다양한 빌딩 세트이며, 나나이트는 손쉽게 큰 도시를 처리할 수 있음을 이미 입증했습니다. 비주얼 충실도를 높이고, 레벨 오브 디테일이 튀는 현상을 없애고, 퍼포먼스를 향상하기 위해 모든 빌딩 메시에 나나이트를 사용하기로 한 것은 당연한 결정이었습니다.
건설
모든 플랫폼에 걸쳐 처음부터 다시 빌드하기엔 포트나이트에 있는 빌딩의 메시가 너무 많았습니다. 따라서 저희는 아티스트가 작성한 디스플레이스먼트 텍스처와 규칙을 가져오고, 기존 버전보다 많은 트라이앵글 수로 디스플레이스된 고퀄리티 나나이트 메시를 만들 수 있는 오프라인 프로세스를 만들었습니다.

참고: ‘런타임’ 디스플레이스먼트가 아니며 디스플레이스된 메시 생성을 위한 포트나이트 전용 오프라인 워크플로입니다.

기본 뷰 렌더링의 비주얼 향상 외에도 디스플레이스된 나나이트 메시로 인해 버추얼 섀도 맵 퀄리티 또한 크게 향상되었습니다. 이전에는 텍스처에 2D 페인팅 영역으로 표현되던 벽돌과 같은 지오메트리 디테일이 이제 실제 3D 스페이스로 디스플레이스되기 때문입니다. 이를 통해 메시에 셀프 섀도잉과 실루엣이 적절하게 적용되고 표면의 뎁스와 디테일이 증가했습니다.
 
포트나이트의 빌딩은 모두 불투명 스태틱 메시이며, 언리얼 엔진 5.0에서 제공되는 나나이트 기능 세트를 통해 전체적으로 렌더링할 수 있습니다. 단, 플레이어가 곡괭이로 건설 구조물을 때릴 때처럼 건설 구조물이 피해를 받는 동안 일시적으로 발생하는 ‘흔들림’ 이펙트는 예외입니다.

흔들림은 머티리얼의 월드 포지션 오프셋을 통해 적용되는 간단한 애니메이션 트랙으로, 시각적으로 흔들림이 발생하지 않는 경우에도 무가중치가 적용돼 있는 상태입니다. 평가는 항상 실시됩니다.

포트나이트에 빌딩 메시가 많기 때문에 저희는 특수 모드를 활성화할 수 있는(r.OptimizedWPO) 이 패턴을 타깃으로 하는 최적화를 구현했고, 머티리얼에 월드 포지션 오프셋을 구동할 로직이 있는지 여부와 무관하게 나나이트는 주어진 프리미티브 컴포넌트에서 디폴트 세팅인 ‘월드 포지션 오프셋 평가’의 활성화 여부만을 평가합니다.
나나이트가 앞서 언급한 ‘래스터라이저 비닝’ 패스를 수행할 때, 보통 프로그래밍 가능한 경로를 취했지만 ‘월드 포지션 오프셋 평가’가 비활성화된 모든 프리미티브는 대신 표준 고정 함수 래스터라이저 경로를 취합니다.

이 최적화는 디스턴스의 월드 포지션 오프셋 비활성화를 포함하여 다양한 부분에서 유용함이 입증되었지만, 특히 빌딩 흔들림에 있어 중요했습니다. 저희는 모든 빌딩 메시에서 ‘월드 포지션 오프셋 평가’를 디폴트로 비활성화했으며, 포트나이트에서 게임 코드를 조정하여 빌딩이 현재 피해를 받는지, 흔들리는지 여부에 따라 이 값을 프로그래밍 방식으로 설정합니다.
이 새로운 최적화와 함께 ‘WPO 평가’ 나나이트 디버그 뷰(r.Nanite.Visualize EvaluateWPO)를 추가했습니다. 이 뷰에서 메시가 현재 월드 포지션 오프셋을 평가 중인 경우 녹색이 표시되며, 그 외의 경우에는 빨간색이 표시됩니다.
이 최적화를 통해 필요할 때 몇 개의 메시에서 프로그래밍 가능한 흔들림 경로를 취하는 경우를 제외하고 거의 모든 빌딩 메시가 고정 함수 경로를 취합니다.
예시 샷
r.OptimizedWPO 꺼짐 vs 켜짐

나무

프로토타입과 개발에 가장 많은 시간을 들인 영역은 나무였습니다. 챕터 4에서는 울창한 숲 영역을 추가하고 싶었기에 예측 가능한 퍼포먼스를 보여주는 효율적인 솔루션이 필요했습니다. 나무는 이전까지 타이틀에 제공하지 않았던 나나이트의 완전히 새로운 기능을 전면적으로 활용했기에 수많은 프로토타입과 최적화 작업을 통해 최종적으로 활용할 접근 방식을 결정해야 했습니다.
생성
초기 실험단계에서는 나무에 마스크드 머티리얼과 카드를 사용했습니다.
포트나이트의 콘텐츠에서는 마스크드 머티리얼을 최대한 사용하지 않고 대신 메시의 트라이앵글 수를 늘리고 특히 나무와 잔디의 머티리얼을 불투명하게 유지하는 데 집중하는 것이 일반적으로 더 간편하다는 것을 알 수 있었습니다. 그 원인은 주로 나나이트의 마스크드 머티리얼이 베이스 패스 셰이딩 도중 많은 비용을 발생시킴에 따라 픽셀당 트라이앵글 무게중심(Barycentrics)을 다시 계산해야 하고, 알파 맵의 네거티브 공간이 오버드로 비용을 더하기 때문입니다.

영역 보존

포트나이트의 나무를 나나이트로 변환한 뒤에는 간소화 프로세스로 인해 원거리에서 나무 둥치가 사라지는 것을 확인했습니다. 나뭇잎의 수가 줄어들거나 거의 보이지 않게 되는 경우도 있었습니다. 각각의 나뭇잎을 단일 트라이앵글 이상으로 간소화할 수 없어 트라이앵글 수를 줄이기 위해 나뭇잎 자체가 제거되는 경우도 있었습니다. 이렇게 나뭇잎을 제거하면 나무 둥치가 시각적으로 작아지는 현상이 나타납니다.

이를 해결하기 위해 나나이트 빌더에 새 로직(메시 ‘나나이트 세팅’에서 활성화할 수 있는 ‘영역 보존’ 옵션)을 추가하여 열린 바운더리 에지를 확장하여 손실된 영역을 남은 트라이앵글에 재분배했습니다. 나뭇잎의 경우, 나머지 나뭇잎이 커지면서 같은 효과를 냅니다. 가까이에서는 이상하게 보이지만 영역 보존이 활성화된 원거리에서는 필요한 밀도를 유지하는 것처럼 보입니다.

이 기능은 이 문제가 나타나는 폴리지 메시에서만 활성화할 수 있습니다.
 
보존 영역 미사용

 
보존 영역 사용
바람 애니메이션
모든 나무가 고퀄리티로 렌더링되어도 바람에 움직이지 않으면 이상하게 보일 것입니다. 지금까지 포트나이트에서는 월드 포지션 오프셋을 구동시키는 복잡한 로직으로 바람 애니메이션을 만들었습니다. 나나이트 나무의 버텍스 수(30~50만 개)가 비나나이트 나무의 버텍스 수(1~2만 개)보다 많고, 월드 포지션 로직이 나나이트의 래스터라이저 내부에서 평가되는 상황에서 저희는 버텍스당 평가 비용을 줄이는 방식으로 나무를 애니메이팅할 다른 방법을 찾아봤습니다.
실험을 통해 모든 버텍스에서 수많은 복잡한 수학 연산을 평가하는 것이 아니라 복잡한 바람 시뮬레이션을 월드 포지션 오프셋을 작동시킬 때 샘플링할 수 있는 텍스처로 구울 수 있게 되었습니다.
나무 지오메트리에서 각 가지의 피벗과 계층구조 내 레벨은 물론 각 가지의 부모 가지를 추출할 수 있습니다. 이 정보로부터 스켈레톤을 만들고 이를 Houdini Vellum 시뮬레이션에 입력할 수 있습니다.
각 가지의 피벗과 시뮬레이션의 오리엔테이션은 픽셀 값으로 이미지에 인코딩된 다음, 머티리얼 셰이더에 샘플링되고, 가지에게 적절한 픽셀 행을 선택하는 데 사용되는 커스텀 UV 값을 사용하여 인덱싱됩니다. 커스텀 uv 값은 메시 에셋에 인코딩 되어 있습니다.

이로 인해 나나이트 래스터라이저가 단일 포지션 및 쿼터니언만을 조회하여 오프셋을 계산하며, 여러 종속적인 텍스처 판독값에 의존하지 않습니다. 이 접근법은 현재 각 가지의 UV 값이 동일한 리지드 애니메이션만 지원합니다.
디스턴스 컬링
나무에서의 바람 시뮬레이션은 카메라와 가까울 때는 매우 중요하지만 멀리서는 구분하기 어렵습니다. 퍼포먼스 최적화를 위해 나나이트에서 아티스트가 정의한 거리에서 월드 포지션 오프셋 계산을 비활성화하는 기능을 추가했습니다. 이 최적화는 ‘월드 포지션 오프셋 평가’ 모드를 기반으로 빌드되었습니다.

그래스

시스템에 고유한 디스턴스 컬링 지원을 포함하여 랜드스케이프 그래스의 나나이트 메시 인스턴스 스폰 지원을 추가했습니다. 이때 에셋 접근법은 나무에 대한 접근법과 유사합니다. 풀잎에 대한 실제 지오메트리에 불투명 머티리얼을 사용했지만 간단한 수학 연산으로 월드 포지션 오프셋 애니메이션을 구동합니다.
 

 

랜드스케이프(나나이트)

버추얼 섀도 맵 작동 방식의 특성으로 인해 대형 비나나이트 메시는 같은 크기의 나나이트 메시에 비해 섀도 렌더링 속도가 느립니다. 이는 많은 GPU 시간을 소비하는 비나나이트 메시인 랜드스케이프에 있어 특히 문제가 되었습니다. UE 5.1에서 출시된 랜드스케이프용 나나이트 렌더링 실험단계 기능을 구현했으며, 이 기능은 랜드스케이프 하이트 필드를 빌드할 때 나나이트 메시로 자동으로 변환합니다. 변환으로 비주얼 퀄리티가 향상되지는 않지만, 베이스 패스 또는 버추얼 섀도 맵으로 렌더링할 때 나나이트 컬링 및 래스터라이제이션의 모든 퍼포먼스 특성을 제공합니다.
루멘에는 랜드스케이프 하이트 필드 트레이싱에 특화된 패스가 있으며, 나나이트는 현재 런타임 버추얼 텍스처로의 렌더링을 지원하지 않으므로 이 경우 나나이트 프레젠테이션이 사용되지 않고 하이트 필드가 대신 사용됩니다.
 

앞으로의 작업

앞으로 가장 중요한 작업은 월드 포지션 오프셋에서 수행하는 애니메이션과 일치하는 정확한 프레임별 인스턴스와 클러스터 바운딩 볼륨 계산일 것입니다. 이는 나나이트의 오클루전 컬링이 래스터라이제이션 전에 가능한 한 많은 클러스터를 제거하는 데 있어 중요합니다.
 

현재는 월드 포지션 오프셋을 무시하고 레퍼런스 포즈 바운드를 사용하는데, 필요한 것보다 더 많은 클러스터를 래스터라이즈하는 등 지나치게 보수적으로 작동합니다. 이 밖에 월드 포지션 오프셋이 레퍼런스 포즈 바운드 바깥에 있는 클러스터를 애니메이팅하는 경우, 메시의 일부가 사라지는 비주얼 아티팩트가 발생합니다. 프리미티브 컴포넌트의 바운드 스케일에 이 문제에 대한 비나나이트 접근법과 유사한 개략적인 지원을 구현했으며, 임의의 수로 바운드를 늘릴 수 있지만 컬링이 더욱 보수적으로 이루어져 불필요한 퍼포먼스 낭비가 발생합니다.

마스크드 머티리얼과 픽셀 뎁스 오프셋이 있는 머티리얼의 비용을 줄이기 위해 나나이트의 머티리얼 시스템을 최적화할 계획도 있습니다.

언리얼 엔진 5.1에서 나나이트 신기능을 출시하게 되어 기쁘며, 이를 통해 개발자들이 만들 멋진 콘텐츠를 기대하고 있습니다!
이 블로그에서 언급된 기능에 대한 자세한 정보는 나나이트 문서를 참조하세요.

    지금 언리얼 엔진을 다운로드하세요!

    세계에서 가장 개방적이고 진보된 창작 툴을 받아보세요.
    모든 기능과 무료 소스 코드 액세스를 제공하는 언리얼 엔진은 제작에 바로 사용할 수 있습니다.