레이 트레이싱 퍼포먼스 가이드

프로젝트에서 레이 트레이싱 기능의 퍼포먼스를 향상하기 위한 다양한 주제에 관해 설명합니다.

Choose your operating system:

Windows

macOS

Linux

리얼타임 퍼포먼스 예산을 유지해야 하는 프로젝트의 경우, 타깃 프레임 레이트를 달성하도록 프레임 예산을 설정하는 것이 중요합니다. 타깃 프레임 레이트는 대개 30fps 또는 60fps(초당 프레임)입니다. 콘텐츠나 워크플로를 조정하여 프로젝트 퍼포먼스를 최적화하고 향상할 기회는 상당히 많습니다.

이 가이드에서는 언리얼 엔진의 레이 트레이싱 기능을 최적화하기 위해 고려해야 할 몇 가지 사항과 함께 씬을 디버깅하고 관련 문제를 조사하여 문제 영역을 정확히 짚어내는 방법을 다룹니다.

레이 트레이싱 비용 개요

하드웨어 레이 트레이싱은 두 가지 레벨의 바운딩 볼륨 계층구조(Bounding Volume Hierarchy, BVH) 를 사용하여 레이 탐색을 가속합니다. 최상위 레벨 가속 구조체(Top Level Acceleration Structure, TLAS) 는 전체 씬에 대한 메시 인스턴스를 모두 포함합니다. 이러한 인스턴스에서 참조하는 메시들이 최하위 레벨 가속 구조체(Bottom Level Acceleration Structures, BLAS) 입니다.

아래의 다이어그램은 BVH가 레이 탐색에 어떻게 작용하는지를 시각적으로 보여줍니다.

레이 트레이싱 가속 구조체 다이어그램

레이 트레이싱과 연관된 비용은 세 가지 주요 카테고리로 나뉩니다.

  1. 스킨을 입힌 메시 또는 헤어처럼 다이내믹하게 변형되는 메시를 위한 최하위 레벨 가속 구조체 빌드.

  2. 씬과 셰이더 바인딩 테이블(Shader Binding Table, SBT)을 위한 최상위 레벨 가속 구조체 빌드.

  3. 레이 트레이싱을 사용하는 각 기능에 대한 레이 탐색.

프로젝트 개발을 위해 콘솔 변수로 특정 지오메트리 타입에 대한 레이 트레이싱 비용을 테스트해 볼 수 있습니다. 이는 특정 지오메트리 타입의 비용을 측정하거나 해당 레이 트레이싱 기능을 완전히 비활성화할 때 유용합니다. 이러한 지오메트리 타입은 r.RayTracing.Geometry.* 아래에서 확인할 수 있습니다.

지오메트리 타입

콘솔 변수

디폴트 상태

스태틱 메시(Static Meshes)

r.RayTracing.Geometry.StaticMeshes

활성화됨

스켈레탈 메시(Skeletal Meshes)

r.RayTracing.Geometry.SkeletalMeshes

활성화됨

인스턴스드 스태틱 메시(Instanced Static Meshes)

r.RayTracing.Geometry.InstancedStaticMeshes

활성화됨

랜드스케이프 터레인(Landscape Terrain)

r.RayTracing.Geometry.Landscape

활성화됨

지오메트리 캐시(Geometry Cache)

r.RayTracing.Geometry.GeometryCache

활성화됨

지오메트리 컬렉션(Geometry Collection)

r.RayTracing.Geometry.GeometryCollection

비활성화됨

나이아가라 메시(Niagara Meshes)

r.RayTracing.Geometry.NiagaraMeshes

활성화됨

나이아가라 리본(Niagara Ribbons)

r.RayTracing.Geometry.NiagaraRibbons

활성화됨

나이아가라 스프라이트(Niagara Sprites)

r.RayTracing.Geometry.NiagaraSprites

활성화됨

프로시저럴 메시(Procedural Meshes)

r.RayTracing.Geometry.ProceduralMeshes

활성화됨

최하위 레벨 가속 구조체 업데이트

스태틱 메시의 최하위 레벨 가속 구조체는 로드할 때나 콘솔에서 쿠킹 중에 한 번만 빌드되는데, 다이내믹하게 변형되는 메시는 프레임마다 리빌드해야 하므로 막대한 비용이 발생할 수 있습니다. 최하위 레벨 가속 구조체 리빌드는 GPU 작업이며, 변형되는 총 트라이앵글 수에 비례하는 것이 일반적입니다. 트라이앵글 수가 많은 스켈레탈 메시를 많이 사용하면 GPU 비용이 빠르게 증가할 수 있습니다.

최하위 레벨 가속 구조체의 리빌드 비용은 GPU 프로파일러(GPU Profiler)의 다음 영역 아래에서 확인할 수 있습니다.

  • Scene > CommitRayTracingGeometryUpdates

  • Scene > CommitHairRayTracingGeometryUpdates

  • Scene > RayTracingGeometry

다음 지오메트리 타입은 프레임마다 리빌드됩니다.

  • GPUSkinCache로 스킨을 입힌 메시

  • 계속 모핑되는 레벨 오브 디테일(LOD)을 지원하기 위해 리빌드되는 랜드스케이프

  • 카오스 디스트럭션을 위한 지오메트리 컬렉션

  • 헤어

  • 프로시저럴 메시

  • 나이아가라 파티클 시스템

하이 폴리곤 스켈레탈 메시는 최하위 레벨 가속 구조체의 빌드 비용을 증가시키는 가장 일반적인 원인입니다. 스켈레탈 메시는 스켈레탈 메시 에디터에 있는 레이 트레이싱 최소 LOD(Ray Tracing Min LOD) 프로퍼티를 사용하여 레이 트레이싱 기능에 최상 LOD가 사용되지 않게 할 수 있습니다.

D3D12로 프로젝트를 실행할 때, 콘솔 명령 D3D12.DumpRayTracingGeometries 를 사용하여 로그에 덤프된 다이내믹 최하위 레벨 가속 구조체 리빌드를 위한 메모리 할당 목록을 모두 얻을 수 있습니다. 이 목록을 사용하여 프로젝트를 최적화할 수 있습니다.

스태틱 메시 컴포넌트의 월드 포지션 오프셋

월드 포지션 오프셋(World Position Offset, WPO)으로 레이 트레이싱 기능을 효율적으로 지원하기란 쉽지 않은데, 이는 각 인스턴스에 고유한 메모리가 있어야 할 뿐 아니라 최하위 레벨 가속 구조체를 다이내믹하게 리빌드해야 하기 때문입니다.

기본적으로 언리얼 엔진은 레이 트레이싱 씬을 빌드할 때 셀프 교차 아티팩트가 발생할 수 있는 월드 포지션 오프셋을 무시합니다. 스태틱 메시 컴포넌트에서는 월드 포지션 오프셋 평가(Evaluate World Position Offset) 세팅으로 월드 포지션 오프셋을 레이 트레이싱 기능에 사용할지 선택할 수 있습니다. 하지만, 별도로 지정하지 않는 한 50m 이내의 카메라 주변의 가까운 거리에서만 작동합니다.

다음을 사용하여 카메라에서 지원되는 WPO 거리를 활성화하고 조정합니다.

  • r.RayTracing.Geometry.StaticMeshes.WPO 1

  • r.RayTracing.Geometry.StaticMeshes.WPO.CullingRadius 5000.0f

월드 포지션 오프셋으로 인한 다이내믹 최하위 레벨 가속 구조체의 빌드는 GPU 프로파일러의 Scene > RayTracingGeometry > RayTracingDynamicGeometryUpdate 아래에 표시됩니다.

인스턴스드 스태틱 메시 컴포넌트와 같은 인스턴스드 컴포넌트는 비용이 막대하게 들기 때문에 기본적으로 월드 포지션 오프셋을 지원하지 않습니다. 월드 포지션 오프셋 평가 토글이 있는 컴포넌트라도 기본적으로 월드 포지션 오프셋을 활성화하지 않습니다. 활성화하면 메모리 부담과 렌더링 시간이 극심하게 증가할 수 있습니다. 단일 메시에 있는 모든 인스턴스를 별도의 최하위 레벨 가속 구조체로 변환하기 때문입니다.

최상위 레벨 가속 구조체 빌드

최상위 레벨 가속 구조체는 프레임마다 리빌드되며, 렌더링 스레드, RHI 스레드, GPU 비용이 듭니다. 이러한 비용은 주로 가속 구조체에 들어가는 메시 인스턴스의 수에 비례합니다.

통계 명령 Stat SceneRendering 을 사용하면, 레이 트레이싱 인스턴스(Ray Tracing Instances) 아래에서 프레임마다 리빌드되는 인스턴스의 수를 찾을 수 있습니다.

Stat SceneRendering으로 Ray tracing instances 확인

렌더링 스레드 비용을 측정하려면 Stat SceneRendering 명령을 사용하고 GatherRayTracingWorldInstances 를 찾습니다.

Stat SceneRendering으로 GatherRayTracingWorldInstances 확인

RHI 스레드 비용은 Stat D3D12RayTracing 등의 RHI별 통계로 측정할 수 있습니다.

Stat D3D12RayTracing으로 RHI 스레드 비용 측정

GPU 비용은 Stat GPU 통계 명령으로 측정할 수 있습니다. RayTracingSceneRayTracing 항목을 통해 비용에 대해 감을 잡아볼 수 있습니다.

Stat GPU로 GPU 비용 측정

차세대 콘솔에서 30fps라는 타깃 프레임 레이트를 달성하려면, 일반적으로 컬링 후 레이 트레이싱 씬에 100,000개 이하의 인스턴스가 있어야 합니다. Windows에서는 인스턴스 수가 크게 다를 수 있습니다.

컬링

레이 트레이싱이 있는 씬에서는 카메라 뷰 바깥의 오브젝트도 씬 안에 있어야 합니다. 반사율이 높은 표면의 경우 특히 그렇습니다. 이러면 씬의 렌더링 비용이 증가합니다. 보이지 않거나 불필요한 오브젝트를 컬링하면 퍼포먼스를 최적화하는 데 도움이 됩니다.

레이 트레이싱을 적용하려면 오브젝트가 뷰 바깥에 있을 때도 계속 표시되어야 하기에, r.RayTracing.Culling 콘솔 변수에서 제공되는 몇 가지 옵션을 통해 현재 뷰 바깥에 표시되는 오브젝트와 그 거리를 최적화할 수 있습니다.

제공되는 옵션은 다음과 같습니다.

  • 1 - 거리 및 입체각에 따라 카메라 뒤에 있는 오브젝트를 컬링합니다. 이는 레이 트레이싱의 디폴트 컬링 방법입니다.

  • 2 - 거리 및 입체각에 따라 카메라 앞과 뒤에 있는 오브젝트를 컬링합니다.

  • 3 - 거리 또는 입체각에 따라 카메라 앞과 뒤에 있는 오브젝트를 컬링합니다.

아래쪽에 있는 옵션일수록 더 많은 오브젝트를 레이 트레이싱 씬에서 컬링합니다.

최상위 레벨 가속 구조체는 프레임마다 리빌드되기 때문에, 옵션 3으로 설정하면 메시 인스턴스가 카메라와의 거리나 각도를 기준으로 컬링될 수 있습니다.

또한 레이 트레이싱 컬링 옵션에서 사용하는 반경(Radius)각도(Angle) 자체도 다음과 같은 콘솔 명령으로 환경설정할 수 있습니다.

  • r.RayTracing.Culling.Radius : 오브젝트가 컬링되기 시작하는 카메라 주변 거리를 설정합니다. 디폴트 반경은 10,000(100미터)입니다.

  • r.Raytracing.Culling.Angle : 투사각이 5도 미만인 메시를 컬링합니다. 디폴트값은 1입니다.

도시 샘플(City Sample)과 같은 오픈 월드 프로젝트에서는 컬링 반경 을 15,000(150미터)으로 늘리고 컬링 각도 는 0.5(2.5도)로 줄였는데, 워낙 반사 표면이 많고 넓은 영역이라 먼 거리에서도 오브젝트를 표시해야 했기 때문입니다.

컬링은 레이 트레이싱 씬에서 커버리지 부족을 일으키며, 멀리 있는 지오메트리를 트레이스할 수 있게 해 주는 파 필드(Far Field)와 함께 사용하면 좋습니다.

0보다 큰 레이 트레이싱 그룹 ID(Ray Tracing Group Id) 로 태그가 지정된 메시 컴포넌트는 r.RayTracing.Culling.UserGroupIds 1 을 사용하여 집계로 컬링할 수 있습니다. 씬이 여러 이질적 요소로 빌드되었지만 하나의 오브젝트로 컬링하고 싶은 경우 이 방법이 유용할 수 있습니다.

레이 트레이싱 디테일 패널 세팅

레이 트레이싱 그룹 ID 프로퍼티는 레벨의 선택된 액터에서 찾을 수 있습니다.

레이 탐색 비용

레이 쿼리는 레이 트레이싱 섀도, 루멘 글로벌 일루미네이션, 루멘 리플렉션 같은 하드웨어 레이 트레이싱을 사용하는 기능에 의해 스폰됩니다. GPU는 가속 구조체를 탐색하며 히트를 찾는 전용 하드웨어로 이러한 레이 쿼리를 솔브합니다.

GPU 프로파일 로그에 출력된 레이 탐색 비용의 예시는 다음과 같습니다.

2.36ms LumenReflections 1 draw 1 prims 0 verts 13 dispatches
4.1% 0.67ms ReflectionHardwareRayTracing [default] <indirect> 1 draw 1 prims 0 verts 1 dispatch 1 groups

레이 탐색 비용은 라이팅 피처로 인한 레이 쿼리의 수와 씬 내 메시의 오버랩 양에 비례합니다.

메시가 오버랩되면 레이는 모든 메시를 각각 탐색하여 가장 가까운 히트를 찾아야 합니다. 레이 트레이싱은 두 가지 레벨의 가속 구조체를 사용하기 때문입니다. 필요에 따라 서로 다른 에셋을 결합하여 빌드(키트배싱)한 씬에서 메시가 오버랩되면 레이 탐색 속도가 대단히 느려질 수 있습니다.

오버랩된 메시

언리얼 엔진 5 기술 데모 ‘에인션트의 협곡'에서 암석 레이어링에 사용된 키트배싱 에셋의 예시입니다.

씬을 하드웨어 레이 트레이싱과 호환되게 하려면 메시 오버랩을 반드시 최소로 유지해야 합니다.

그 밖에도 레이 탐색 비용을 높이는 몇 가지 일반적인 원인이 있습니다. 첫째는 스카이 박스입니다. 스카이 박스는 씬 전체와 오버랩되므로, 히트되지 않더라도 모든 레이에서 탐색해야 합니다. 다른 하나는 그래스입니다. 그래스는 바운드가 크고 지오메트리가 매우 복잡합니다.

이런 경우나 이와 비슷한 경우, 레이 트레이싱에서 해당 메시를 건너뛰도록 할 수 있습니다. 월드에 있는 해당 액터를 선택하고 '디테일(Details)' 패널에서 레이 트레이싱에서 표시(Visible in Ray Tracing) 를 비활성화하면 됩니다.

레이 탐색 디버그 시각화 모드

다음 디버그 모드는 현재 콘솔 플랫폼에서만 사용할 수 있습니다.

높은 탐색 비용을 파악하는 데 유용한 디버그 모드가 두 가지 있는데, 퍼포먼스 모드와 탐색 모드입니다.

다음 명령을 사용하여 이러한 모드를 활성화할 수 있습니다.

show raytracingdebug 1
r.RayTracing.DebugVisualizationMode [mode]

여기서 ‘[mode]'를 Performance 또는 Traversal Node 중 원하는 시각화 메서드로 대체하면 됩니다. 예를 들면 r.RayTracing.DebugVisualizationMode Traversal Node 같은 식입니다.

퍼포먼스 디버그 시각화

퍼포먼스 디버그 시각화는 TraceRay 호출의 히트맵을 보여주며, 바운딩 볼륨 계층 구조(BVH) 탐색 및 머티리얼 평가 시간(가장 가까운 히트/미스 셰이더 실행)의 결합 시간을 표시합니다.

퍼포먼스 디버그 시각화

레이 트레이싱 퍼포먼스 디버그 시각화입니다.

시각화 색은 보라색(비용 없음)에서 노란색(고비용) 사이로 표시됩니다. 히트맵 스케일은 r.RayTracing.DebugTiming Scale 을 사용하여 프로젝트에 맞게 조절할 수 있습니다.

이 모드는 레이 트레이싱에 문제를 일으키는 오브젝트와 머티리얼을 찾는 데 가장 유용합니다. 레이 트레이싱의 비용이 너무 높다면 그 모드에서 표시되는 것들이 합리적인지 확인해 보는 것이 좋습니다.

예를 들어 메인 뷰에서 표시되는 오브젝트가 디버그 모드에서도 표시되는지, 원치 않는 오브젝트가 표시되지 않는지, 머티리얼 비용이 해당 오브젝트에 대하여 예상한 대로인지 등을 확인할 수 있습니다. 눈에 띄는 것이 없다면 하나의 오브젝트 때문에 느려진 것이 아니라 여러 작은 문제가 결합된 것일 수 있습니다.

탐색 디버그 시각화

탐색 디버그 시각화는 BVH 탐색의 히트맵만 보여주며, 히트를 찾기까지 필요한 반복작업의 현황을 표시합니다. 머티리얼을 사용하지 않는 루멘 패스나 단순한 히트 셰이딩/인라인을 사용하는 유사한 패스의 경우, 일반적으로 BVH 탐색에서 가장 높은 비용이 발생합니다.

히트맵의 색은 초록색(반복작업 거의 없음)에서 빨간색(반복작업 많음) 사이로 표시됩니다. 당연히, 반복작업이 많을수록 탐색 속도가 느려집니다. 보통 씬의 반복작업 값은 50~100회 범위입니다. 하이 폴리곤 메시가 여러 번 오버랩되는 복잡한 씬에서는 약 100~150회의 반복작업이 발생합니다.

횟수가 이보다 많으면 문제가 있을 수 있습니다. 예를 들어 메시가 깨진 경우 1,000회 이상의 반복작업도 드물지 않게 나타납니다. 트라이앵글 탐색 디버그 시각화는 개별 메시 트라이앵글을 확인하는 데 유용합니다.

탐색 디버그의 경우 다음 세가지 모드 중에서 선택할 수 있습니다.

탐색 디버그 모드

명령 이름

설명

시각화 뷰

노드 교차 횟수(Node Intersection Count)

Traversal Node

씬의 탐색 비용을 파악할 때 사용합니다. 예를 들어 최상위 레벨 가속 구조체에서 많은 인스턴스가 오버랩될 때 사용할 수 있습니다.

최하위 레벨 가속 구조체를 내부적으로, 플랫폼별로 표현하는 BVH 노드입니다.

트라이앵글 교차 횟수(Triangle Intersection Count)

Traversal Triangle

트라이앵글만 포함된 노드(리프 노드)의 히트를 표시합니다.

총 교차 횟수(Total Intersection Count)

Traversal All

BVH 노드 히트와 트라이앵글 노드 히트의 합계입니다.

히트 셰이딩 비용

레이가 트라이앵글에 히트하면 머티리얼이 평가되고 히트 포인트 셰이딩에 사용됩니다. 프로시저럴 텍스처링을 사용하는 복잡한 머티리얼과 기타 많은 버추얼 텍스처의 경우, 이 프로세스에 매우 높은 비용이 들 수 있습니다.

RayTracingQualitySwitchReplace 노드는 레이 히트 셰이딩을 더 저렴하게 구현하기 위해 머티리얼에 사용할 수 있는 표현식입니다.

RayTracingQualitySwitchReplace 머티리얼 노드

이 노드는 머티리얼 로직의 모든 부분을 대체하여 레이 트레이싱 기능의 전체 비용을 줄일 수 있습니다. 이 노드를 사용하면 이 머티리얼의 모든 레이 트레이싱 이펙트에 영향을 줍니다.

아래 이미지와 같이 레이 트레이싱 이펙트 비용이 많이 드는 로직이 포함된 머티리얼을 예로 들 수 있습니다. RayTracingQualitySwitchReplace 노드에 Normal과 RayTraced 두 가지 입력이 있습니다.

Normal 입력에는 머티리얼에 필요한 모든 로직이 포함되어 있고 월드 표면에 표시되는 방식입니다. RayTraced 입력은 노멀 맵처럼 레이 트레이싱 이펙트의 비용을 늘리는 로직 경로의 복잡도가 덜한 편입니다.

전체 크기로 보려면 이미지를 클릭하세요.

파 필드

레이 트레이싱은 기본적으로 루멘 글로벌 일루미네이션 및 리플렉션을 카메라에서 1km까지 확장하는 파 필드(Far Field) 표현을 지원합니다. 파 필드는 기본적으로 월드 파티션에 의해 생성된 계층형 레벨 오브 디테일(Hierarchical Level of Detail, HLOD) 메시를 사용합니다. HLOD1 메시가 파 필드 표현에 사용됩니다.

현재는 루멘 라이팅 피처에만 레이 트레이싱 파 필드를 사용할 수 있으며, 그러려면 r.LumenScene.FarFields 1 명령을 통해 프로젝트에서 활성화해야 합니다.

파 필드에 표시해야 하는 메시를 선택하고 레이 트레이싱 파 필드(Ray Tracing Far Field) 세팅을 토글하면 됩니다.

레이 트레이싱 파 필드 세팅

에디터에서 FarField 에 대한 레이 트레이싱 디버그 시각화 모드를 사용하여 파 필드를 시각화할 수 있습니다. 다음 명령을 입력하면 됩니다.

r.RayTracing.DebugVisualizationMode FarField
Showflag.RayTracingDebug 1

아래의 시각화에서, 파 필드는 월드 파티션에 의해 생성된 HLOD1 메시를 사용하는 빨간색 톤의 지오메트리입니다. 이보다 카메라에 더 가까운 것은 고도로 디테일한 지오메트리입니다.

파 필드 시각화

루멘의 레이 트레이싱 파 필드 디버그 시각화입니다. 파 필드 지오메트리는 빨간색 톤입니다.