스켈레탈 메시 렌더링 경로

스켈레탈 메시에 사용할 수 있는 렌더링 경로에 대한 중요한 사항을 간략하게 살펴봅니다.

언리얼 엔진에서 스켈레탈 메시가 다양한 경로를 사용하여 렌더링되는 몇 가지 방법이 있습니다. 이 페이지에서는 다양한 경로와 프로젝트에서 이러한 경로를 사용하는 방법을 살펴봅니다.

스켈레탈 메시가 렌더링되는 방식

스켈레탈 메시에는 다음과 같은 세 가지 렌더링 경로가 있습니다.

섹션 및 청크

스켈레탈 메시는 섹션(Sections) 또는 청크(Chunks) 두 가지 방식으로 나누어집니다. 스켈레탈 메시의 각 섹션은 머티리얼과 연관되어 있습니다. 본마다 너무 많은 버텍스가 영향을 주는 경우처럼 한 섹션의 지오메트리가 너무 복잡하면, 지오메트리 파이프라인이 지오메트리를 청크로 추가로 나누게 되며, 이는 메시가 생성할 드로 콜 수에 대응됩니다.

스켈레탈 메시 에디터에서 스켈레탈 메시 에셋을 볼 때 디테일 패널에서 메시의 머티리얼이 나누어지는 방식을 알 수 있습니다. 각 LOD 카테고리에서 섹션(Sections) 을 펼쳐 머티리얼과 청크의 목록을 확인합니다.

아래는 두 가지 예시입니다. 첫 번째는 가장 일반적인 결과로, 각 스켈레탈 메시와 그 LOD의 머티리얼 목록 또는 섹션 목록이 표시됩니다. 두 번째는 더 고급 분석으로 섹션(1)이 청크(2)로 나누어진 경우를 보여줍니다. 일반적으로 말해 스켈레탈 메시 에디터의 섹션은 머티리얼에 매핑됩니다. 런타임 시, 렌더링 코드의 섹션은 청크를 참조합니다.

머티리얼 섹션만 있는 스켈레탈 메시

머티리얼 섹션과 청크가 있는 스켈레탈 메시

머티리얼 섹션만 있는 스켈레탈 메시 에셋

섹션(1)과 청크(2)가 있는 스켈레탈 메시 에셋

8비트/16비트 본 인덱스

스켈레탈 메시는 임포트 시 8비트 또는 16비트 본 인덱스를 가질 수 있는데, 이는 섹션에서 지원 가능한 본 수를 설정합니다. 8비트 본 인덱스는 섹션당 최대 256개의 본을 지원하며, 16비트 본 인덱스는 256개을 초과하는 본을 지원합니다.

모든 메시는 기본적으로 8비트 본 인덱스를 사용하여 임포트됩니다. 프로젝트 세팅(Project Settings)엔진(Engine) > 렌더링(Rendering) > 스키닝(Skinning) 아래에서 16비트 본 인덱스 지원(Support 16-bit Bone Index) 박스를 체크하면 섹션당 더 많은 본을 지원할 수 있습니다.

16비트 본 인덱스 지원 활성화

이 세팅을 활성화하는 경우

  • 변경사항을 적용하려면 에디터를 재시작해야 합니다.

  • 변경하기 전에 이미 프로젝트에 스켈레탈 메시가 있는 경우, 반드시 리임포트해야 업데이트가 가능합니다.

  • 임포트된 스켈레탈 메시는 섹션에 있는 본의 수가 256개 이하인지에 따라 8비트 또는 16비트를 사용합니다.

섹션당 최대 본

스켈레탈 메시는 임포트되는 모든 소스 메시에 섹션당 최대한도의 본을 허용합니다. 섹션당 허용된 본의 수는 단일 드로 콜로 GPU에서 스키닝될 수 있는 본의 수입니다. 소스 메시가 섹션당 최대 본 제한을 초과하는 경우, 지오메트리 파이프라인은 해당 섹션을 한도에 맞게 더 작은 청크들로 나눕니다.

섹션당 최대 본 수를 제어하는 일반 사용 사례로는 프로젝트에서 고급 플랫폼과 모바일 플랫폼을 모두 지원하는 경우가 있습니다. 가령 고급 플랫폼과 모바일 플랫폼을 모두 지원하는 경우 모바일 플랫폼을 수용하려면 섹션당 최대 75개의 본이 필요합니다.

프로젝트 세팅 을 사용하여 엔진 > 렌더링 > 스키닝 섹션에서 섹션당 최대 본(Maximum bones per Sections) 을 설정합니다.

섹션당 최대 본 설정

추가 (+) 아이콘을 클릭하고 목록에서 플랫폼을 선택하여 이 세팅을 플랫폼별로 오버라이드할 수 있습니다.

플랫폼별로 섹션당 최대 본 추가

플랫폼별 설정은 글로벌 세팅 Compat.MAX_GPUSKIN_Bones 로 고정됩니다. 이 값은 기본적으로 65536으로 설정되며 이 값을 초과해서는 안 됩니다. 16비트 인덱스 모드가 활성화되지 않은 경우 그 한도는 256, 즉 8비트 본 인덱스로 고정됩니다.

콘솔 명령 SkeletalMeshReport 를 사용하면 프로젝트에서 각 스켈레탈 메시를 분석한 통계 로그를 출력할 수 있습니다. 이 분석에는 각 스켈레탈 메시의 설정과 메모리 사용량 정보가 포함되어 있습니다.

skelmesh-summary-report.png

GPU로 스키닝된 버텍스 팩토리

GPU로 스키닝된 버텍스 팩토리(GPU Skinned Vertex Factory) 는 버텍스 셰이더를 사용하여 위치와 노멀/탄젠트를 스키닝하며, 그 결과는 필요에 따라 GPU에 저장됩니다. 각 버텍스 팩토리는 디폴트 본 인플루언스(Default Bone Influences)무제한 본 인플루언스(Unlimited Bone Influences) 를 모두 지원합니다.

디폴트 본 인플루언스는 각 버텍스가 4개 또는 8개의 본 인플루언스로 스키닝될 수 있는지 여부를 제어합니다. 본 인플루언스의 수는 다음과 같이 고정됩니다. 만약 스켈레탈 메시가 버텍스당 4개의 본으로 렌더링되는 경우, 버텍스에 하나의 본만 사용하면 남은 3개의 슬롯은 웨이트 0으로 채워지며 여전히 스키닝 계산에 계속 사용됩니다. 본 인덱스와 웨이트는 버텍스 스트림에 바운드되어 이 모드를 저사양 하드웨어 플랫폼에 적합하게 만듭니다.

무제한 본 인플루언스는 버텍스당 고정된 수의 본 인플루언스를 제거하고 대신 변수 수에 해당하는 본 인플루언스를 사용합니다. 버텍스 스트림에 직접 바운드되는 본 인덱스/웨이트 대신, 각 버텍스는 단일 정수에 패킹된 인덱스 오프셋과 본 인플루언스 수를 저장합니다. 이 값은 본 인덱스 및 웨이트 데이터가 포함된 버텍스 버퍼를 찾는 데 사용됩니다.

무제한 본 인플루언스 모드 활성화하기

무제한 본 인플루언스 모드는 프로젝트 세팅엔진 > 렌더링 > 스키닝 섹션에서 활성화됩니다.

무제한 본 인플루언스 사용 활성화

다음 두 가지 세팅을 반드시 설정해야 합니다.

  • 무제한 본 인플루언스 사용(Use Unlimited Bone Influences) 은 새로 임포트했거나 리임포트한 모든 스켈레탈 메시가 디폴트 최대 본 인플루언스가 아닌 무제한 본 버퍼를 렌더링에 사용할 수 있게 합니다. 이 세팅은 런타임에 변경할 수 없으며 활성화하려면 에디터를 재시작해야 합니다.

  • 무제한 본 인플루언스 한계치(Unlimited Bone Influences Threshold) 는 메시의 최대 디폴트 본 인플루언스가 한도를 초과할 때까지 버퍼당 고정된 본 인플루언스를 사용합니다.

이론상으로는 버텍스당 최대 인플루언스 수가 무제한입니다. 하지만 실제로는 스켈레탈 메시 소스 데이터의 저장 방식 때문에 최대 인플루언스 수는 12개로 제한됩니다.

무제한 본 인플루언스 모드를 사용하는 경우 무제한 본 인플루언스 를 활성화하고 무제한 본 인플루언스 한계치8 개로 설정하는 것이 좋습니다. 9~12개의 본 인플루언스를 가진 스켈레탈 메시는 무제한 본 인플루언스 경로를 사용하여 렌더링되며, 0~8개의 본 인플루언스를 가진 스켈레탈 메시는 고정된 4개/8개의 본 인플루언스 경로를 사용하여 렌더링됩니다.

스킨 캐시 시스템

스킨 캐시(Skin Cache) 시스템은 컴퓨트 셰이더(Compute Shader) 를 사용하여 위치 및 노멀/탄젠트를 스키닝하며, 그 결과를 버텍스 버퍼에서 캐시한 후, 렌더링을 위해 LocalVertexFactory 의 베리에이션인 GPUSkinPassThroughVertexFactory 에 전달합니다.

스킨 캐시 시스템 버퍼 흐름

프로젝트 세팅엔진 > 렌더링 > 최적화(Optimizations) 에서 스킨 캐시 계산 지원(Support Compute Skin Cache) 세팅을 사용하여 스킨 캐시 시스템을 활성화할 수 있습니다.

스킨 캐시 계산 지원 활성화

스킨 캐시 시스템을 사용하면 유연하게 프로젝트 레벨에서 비헤이비어를 정의하고 개별 스켈레탈 메시가 그 비헤이비어를 오버라이드할 수 있습니다.

다음 프로젝트 세팅을 사용하여 스킨 캐시 비헤이비어 및 지원을 설정합니다.

  • 기본 스킨 캐시 비헤이비어(Default Skin Cache Behavior) 는 스켈레탈 메시가 스킨 캐시 또는 GPUSkinVertexFactory 경로를 통과하도록 제어합니다. 다음 두 가지 비헤이비어 중에서 선택할 수 있습니다.

    • 포함(Inclusive) 은 기본적으로 스킨 캐시에 모든 스켈레탈 메시를 포함합니다. 개별 스켈레탈 메시를 선택 취소하고 대신 GPUSkinVertexFactory 경로를 사용할 수 있습니다.

    • 제외(Exclusive) 는 스킨 캐시에서 모든 스켈레탈 메시를 제외하고 기본적으로 GPUSkinVertexFactory를 사용합니다. 스킨 캐시를 사용하도록 개별 스켈레탈 메시를 선택할 수 있습니다.

  • 월드당 스킨 캐시 계산 최대 메모리(Maximum memory for Compute Skin Cache per world)(MB) 는 출력 버텍스 데이터를 생성하고 탄젠트를 재계산할 때 스킨 캐시 계산에 허용할 월드/씬당 최대 메모리 양(MB)을 설정합니다. 각 월드에는 자체적인 스킨 캐시 오브젝트가 있어, 스켈레탈 메시가 스킨 캐시에 선착순으로 삽입됩니다.

    삽입 순서는 게임마다 다릅니다. 스킨 캐시가 가득 차고 다른 스켈레탈 메시를 수용할 수 없는 경우, 해당 메시는 대신 GPUSkinVertexFactory 경로를 통과합니다. 그러면 레벨 오브 디테일(LOD)과 관련하여 문제가 발생하는 상황이 될 수 있습니다. 만약 메시가 디테일이 적은 상위 LOD에서 디테일이 많은 하위 LOD로 바뀔 때 스킨 캐시가 상위 LOD를 언로드하더라도 메모리의 과다 사용으로 인해 하위 LOD를 수용할 수 없는 경우가 생길 수 있습니다.

그럴 때는 다음과 같은 콘솔 명령을 사용할 수 있습니다.

  • r.SkinCache.Mode 는 스킨 캐싱 활성화 여부를 설정합니다. 기본적으로 활성화되어 있습니다(1).

  • r.SkinCache.SkipCompilingGPUSkinVF 는 스킨 캐시 시스템이 활성화될 때 셰이더 순열 컴파일을 건너뜀으로써 GPU 스킨 버텍스 팩토리 베리언트를 줄입니다.

    • 0 은 모든 GPU 스킨 버텍스 팩토리 베리언트를 컴파일합니다. (기본값)

    • 1 은 모든 GPU 스킨 버텍스 팩토리 셰이더 순열을 컴파일하지 않습니다.

스켈레탈 메시에 스킨 캐시 오버라이드하기

개별 스켈레탈 메시 LOD는 스킨 캐시 사용(Skin Cache Usage) 드롭다운에서 선택하면 스킨 캐시 비헤이비어를 오버라이드할 수 있습니다.

스켈레탈 메시로 스킨 캐시 사용을 사용하도록 설정

아래 중 하나를 선택합니다.

  • 자동(Auto): 프로젝트 세팅에 설정된 글로벌 비헤이비어를 기본 스킨 캐시 비헤이비어에 사용합니다.

  • 비활성화(Disabled): 이 메시가 스킨 캐시를 사용하지 않게 됩니다. 메시에 하드웨어 레이 트레이싱이 활성화되어 있다면 스킨 캐시도 활성화되어 있다는 의미입니다.

  • 활성화(Enabled): 이 메시가 스킨 캐시를 사용하게 됩니다.

레이 트레이싱 및 헤어 스트랜드 스킨 캐시 렌더링 요구 사항

하드웨어 레이 트레이싱(Hardware Ray Tracing)헤어 스트랜드 렌더링(Hair Strand rendering) 같은 렌더링 기능은 렌더링할 때 스킨 캐시 경로를 요구합니다. 하지만 디포머 그래프로 디스플레이스먼트를 구동하는 경우에는 스킨 캐시 경로가 사용되지 않습니다. 레이 트레이싱 및 헤어 스트랜드 렌더링은 디포머 그래프가 사용될 때마다 여전히 작동합니다.

하드웨어 레이 트레이싱을 사용하면 모든 스켈레탈 메시가 자동으로 스킨 캐시 경로를 통과하며 레이 트레이싱 이펙트에 렌더링됩니다. 스켈레탈 메시의 하드웨어 레이 트레이싱을 비활성화하려면 r.RayTracing.Geometry.SupportSkeletalMeshes 를 사용합니다. 그러면 GPU 메모리와 타임 리소스를 절약할 수 있습니다. 런타임에 변경할 수는 없습니다.

메시에는 기존 래스터 LOD에서 별도의 레이 트레이싱된 LOD를 사용하는 옵션도 있습니다. 글로벌 레이 트레이싱 LOD 바이어스(r.RayTracing.Geometry.SkeletalMeshes.LODBias ) 세팅과 개별 스켈레탈 메시 레이 트레이싱 최소 LOD(Ray Tracing Min LOD) 세팅의 조합으로 이 옵션을 제어할 수 있습니다. 래스터 LOD 인덱스와 글로벌 레이 트레이싱 LOD 인덱스 사이에서 더 상위 LOD 인덱스가 선택되며, 레이 트레이싱 최소 LOD를 설정합니다.

스켈레탈 메시의 레이 트레이싱에 사용할 최소 LOD 설정

탄젠트 재계산

탄젠트 재계산(Recompute Tangents) 은 스키닝 패스 후 선택적으로 사용할 수 있는 스킨 캐시 단계입니다. 스킨 캐시는 스키닝된 트라이앵글을 사용하여 노멀과 탄젠트를 재계산하며, 다음 두 단계의 컴퓨트 셰이더 과정으로 재계산을 수행합니다.

  • 트라이앵글 패스(Triangle Pass) 단계에서는 각 트라이앵글이 스키닝된 버텍스 위치에서 노멀과 탄젠트를 계산하며 세 버텍스 각각에 그 결과를 축적합니다.

  • 버텍스 패스(Vertex Pass) 단계에서는 각 버텍스가 축적된 노멀과 탄젠트를 정규화합니다. 메시의 버텍스 컬러 버퍼 채널 중 하나는 스키닝된 노멀/탄젠트와 재계산된 노멀/탄젠트 사이의 블렌드 마스크로 선택적으로 사용 가능합니다.

프로젝트에 글로벌하게 또는 스켈레탈 메시별로 탄젠트 재계산을 설정할 수 있습니다.

글로벌 세팅:

  • r.SkinCache.RecomputeTangents

    • 1 은 모든 스켈레탈 메시의 탄젠트를 강제로 재계산합니다.

    • 2 는 섹션에 재계산을 활성화한 스켈레탈 메시의 탄젠트만 재계산합니다. (기본값)

메시별 세팅:

LOD [n] 카테고리에서 섹션을 사용하여 각 머티리얼 섹션의 탄젠트 재계산을 처리하는 방법을 설정합니다.

스켈레탈 메시의 탄젠트 재계산 설정

다음과 같은 옵션을 선택할 수 있습니다.

  • 없음(None): 탄젠트를 재계산하지 않습니다.

  • 모두(All): 모든 컬러 채널의 탄젠트를 재계산하고 재계산된 결과를 사용합니다.

  • 빨간색(Red)/녹색(Green)/파란색(Blue): R/G/B 버텍스 컬러 버퍼 채널을 블렌딩 마스크로 사용하여 스킨 적용 결과로 탄젠트 및 선형보간을 재계산합니다.

탄젠트 재계산의 한 가지 제한은 각 청크가 다른 메시의 청크로부터 독립적으로 처리된다는 점입니다. 따라서 다른 인접 청크와 연결된 청크의 버텍스는 서로의 연결성을 인지하지 못합니다. 결과적으로 두 청크의 경계에 이음새가 보일 수 있습니다.

스킨 캐시 디버깅 팁

다음을 사용하여 프로젝트에서 스킨 캐싱을 디버그할 수 있습니다.

콘솔 명령

  • profilegpu 를 사용하면 GPU 프레임과 함께 개별 스킨 캐시 항목과 그 항목이 속한 스켈레탈 메시의 디테일을 캡처합니다. 스킨 캐시 항목 프로파일링을 위해 GPU 프레임 캡처

  • r.SkinCache.PrintMemorySummary 을 사용하면 모든 스킨 캐시 항목의 메모리 사용에 대한 분석을 출력합니다.

    • 0 은 요약을 비활성화합니다. (기본값)

    • 1 은 메모리가 'r.SkinCache.SceneMemoryLimitInMB' 로 설정한 제한 또는 프로젝트 세팅에서 월드당 스킨 캐시 계산 최대 메모리(MB) 로 설정한 제한을 초과할 때 프레임 요약을 출력합니다.

    • 2 는 매 프레임마다 요약을 출력합니다.

스킨 캐시 디버그 시각화

GPU 스킨 캐시 목록의 디버그 시각화 중 하나에 뷰 모드 드롭다운을 사용하여 개별 스켈레탈 메시를 색을 입히며 시각화합니다.

스킨 캐시 디버그 시각화 메뉴

이러한 시각화 모드를 사용하려면 콘솔 명령 r.SkinCache.Visualize 를 입력한 후 Overview , Memory , RayTracingLODOffset 중 하나를 입력하고서 -game 명령줄 실행인자를 통해 프로젝트를 시작하면 됩니다. 시각화를 비활성화하려면 None 으로 명령을 실행합니다. 이러한 뷰 모드는 패키지로 만든 빌드에서는 비활성화됩니다.

개요 시각화

개요(Overview) 시각화는 스킨 캐시가 있고 탄젠트 재계산이 활성화 또는 비활성화된 씬의 액터를 보여줍니다.

스킨 캐시 개요 디버깅 시각화

뷰포트 왼쪽 상단에 씬의 액터에 대한 컬러 레퍼런스가 표시됩니다.

스킨 캐시 개요 디버깅 시각화 통계

메모리 시각화

메모리(Memory) 시각화는 래스터와 레이 트레이싱이 결합된 스킨 캐시 메모리 사용량이 낮은 경우와 중간인 경우와 높은 경우를 표시합니다.

스킨 캐시 메모리 디버깅 시각화

뷰포트 왼쪽 상단에 스킨 캐시 메모리 정보가 표시됩니다.

스킨 캐시 메모리 디버깅 시각화 통계

프로젝트별 메모리 한계치를 오버라이드하려면 DefaultEngine.ini 환경설정 파일의 [/Script/Engine.Engine] 섹션에 있는 GPUSkinCacheVisualizationLowMemoryThresholdInMBGPUSkinCacheVisualizationHighMemoryThresholdInMB 값을 편집하면 됩니다.

RayTracingLODOffset 시각화

RayTracingLODOffset 시각화는 레이 트레이싱된 스킨 캐시 항목과 래스터 스킨 캐시 항목 간의 LOD 인덱스 차이를 보여주며, 레이 트레이싱이 래스터화에 사용한 것과는 다른 별도의 LOD를 사용할 때 유용합니다.

스킨 캐시 RayTracingLOD 오프셋 디버깅 시각화

이 시각화 모드는 프로젝트 세팅에서 하드웨어 레이 트레이싱이 활성화된 경우에만 사용할 수 있습니다.

씬에 있는 액터의 레이 트레이싱 LOD 오프셋의 컬러 코드가 뷰포트의 왼쪽 상단에 표시됩니다.

스킨 캐시 RayTracingLOD 오프셋 디버깅 시각화 통계

디포머 그래프 플러그인

현재 베타 단계의 기능입니다.

디포머 그래프(Deformer Graph) 플러그인은 GPU에서만 실행되는 버텍스 디포메이션 파이프라인을 생성할 수 있는 에디터입니다. 이 플러그인을 사용하면 플러그 앤 플레이를 위한 그래프 편집 기능을 제공하며, 수신된 입력에 따라 메시 버텍스 포인트를 수정하는 데 필요한 데이터 흐름을 설정할 수 있습니다.

디포머 그래프