스트리밍 버추얼 텍스처링

스트리밍 텍스처링 메서드의 개요입니다.

Choose your operating system:

Windows

macOS

Linux

스트리밍 버추얼 텍스처링(Streaming Virtual Texturing, SVT) 은 디스크에서 프로젝트의 텍스처를 스트리밍하는 방식의 대안으로 사용할 수 있습니다. SVT는 언리얼 엔진의 기존 밉 기반 텍스처 스트리밍과 비교하면 몇 가지 장단점이 있습니다.

기존 밉 기반 텍스처 스트리밍은 머티리얼 UV 사용량에 대한 오프라인 분석을 한 다음, 런타임에서 오브젝트 비저빌리티 및 거리에 따라 로드할 텍스처의 밉 레벨을 결정합니다. 고려되는 스트리밍 데이터가 전체 텍스처 밉 레벨이므로 이 프로세스가 제한될 수 있습니다.

고해상도 텍스처를 사용할 때는 밉 레벨이 높은 텍스처를 로드하면 상당한 퍼포먼스와 메모리 오버헤드가 발생할 수 있습니다. 또한, CPU는 CPU 기반 오브젝트 비저빌리티와 컬링을 사용하여 밉 기반 텍스처 스트리밍을 결정합니다.

비저빌리티는 대상을 로드하지 않을 가능성이 높게 하여 오브젝트가 갑자기 뷰에 나타나지 않도록 하기 위해 더 보수적입니다. 따라서 오브젝트의 일부만 보여도 오브젝트 전체가 보이는 것으로 여겨집니다. 로드된 오브젝트에는 스트리밍에 필요할 수 있는 모든 관련 텍스처가 포함됩니다.

반면 버추얼 텍스처링 시스템은 오브젝트가 보이는 데 필요한 텍스처의 일부분만 스트리밍합니다. 시스템은 이를 위해 모든 밉 레벨을 고정된 크기의 작은 타일로 분할합니다. GPU는 보이는 타일 중 화면에 보이는 모든 픽셀이 액세스하는 타일을 결정합니다. 즉, 오브젝트가 눈에 보인다고 UE가 판단하면 이 사실을 전달받은 GPU는 필요한 타일을 GPU 메모리 캐시로 로드합니다. 텍스처 크기와 관계없이 SVT의 고정된 타일 크기는 눈에 보이는 것만 고려합니다. 타일 GPU는 표준 뎁스 버퍼를 사용하여 비저빌리티를 계산하므로, SVT 요청은 픽셀에 영향을 미치는 가시적인 부분에 대해서만 발생합니다.

버추얼 텍스처링 활성화

프로젝트 세팅(Project Settings)엔진(Engine) > 렌더링(Rendering) > 버추얼 텍스처(Virtual Textures) 에서 버추얼 텍스처 지원 활성화(Enable virtual texture support) 옆의 박스를 체크합니다.

이미지를 클릭하면 최대 크기로 볼 수 있습니다.

프로젝트 세팅의 에디터(Editor) > 텍스처 임포트(Texture Import) > 버추얼 텍스처(Virtual Textures) 카테고리에서 SVT를 위해 새로 임포트된 텍스처의 최소 텍스처 크기를 지정할 수 있습니다. 텍스처가 최소 크기를 만족하면 해당 텍스처 에셋에 자동으로 버추얼 텍스처 스트리밍(Virtual Texture Streaming) 이 활성화됩니다.

이러한 세팅에 대한 정보는 버추얼 텍스처링 레퍼런스 페이지를 참조하세요.

텍스처 및 머티리얼 변환

프로젝트의 버추얼 텍스처링을 활성화하려면 텍스처와 머티리얼이 올바르게 작동하도록 구성해야 합니다. 텍스처는 버추얼 텍스처 스트리밍(Virtual Texture Streaming) 지원이 활성화되어 있어야 하며, 머티리얼의 텍스처 샘플(Texture Samples) 은 넌버추얼(non-Virtual)이 아닌 버추얼(Virtual) 샘플러 타입을 사용해야 합니다.

아래 옵션을 사용하면 SVT에 사용할 텍스처와 머티리얼을 올바르게 구성할 수 있습니다.

변환 메뉴 옵션

  1. 콘텐츠 브라우저에서 SVT를 사용하기 위해 변환하고 싶은 텍스처 에셋을 선택합니다.

  2. 우클릭해서 컨텍스트 메뉴를 열고 버추얼 텍스처로 변환(Convert to Virtual Texture) 을 선택합니다.

    CB_ConvertToVT.png

    이 메뉴 옵션에서는 버추얼 텍스처를 일반 텍스처로 변환할 수도 있습니다.

  3. 변환(Convert To) 창에 선택한 텍스처와 이를 참조하는 머티리얼이 표시됩니다.

    CB_ConvertToWindow.png

  4. 확인(Ok) 을 클릭해서 변환 프로세스를 시작합니다.

변환 프로세스 중에 텍스처 에셋의 텍스처 에디터 세팅에서 버추얼 텍스처 스트리밍 이 활성화됩니다. 선택한 텍스처를 참조하는 머티리얼의 경우 Texture Sample 노드가 변환되어 넌버추얼이 아닌 버추얼(Virtual) 샘플러 타입을 사용하게 됩니다.

수동 변환

  1. 콘텐츠 브라우저에서 텍스처 에셋을 더블 클릭하여 텍스처 에디터(Texture Editor) 를 엽니다.

  2. 디테일(Details) 패널의 텍스처(Texture) 항목에서 버추얼 텍스처 스트리밍(Virtual Texture Streaming) 을 활성화합니다.

    TE_EnableSVT.png

위의 변환 메뉴 옵션(conversion menu option)을 사용하지 않고 이 옵션을 활성화하면 변환된 텍스처를 참조하는 모든 기존 머티리얼이 무효화됩니다. 문제가 되는 텍스처를 참조하는 머티리얼을 모두 열어 Texture Sample 노드가 올바른 버추얼(Virtual) 샘플러 타입을 사용하도록 설정해야 합니다. 예를 들어, 버추얼 텍스처의 샘플러 타입은 컬러(Color) 가 아닌 버추얼 컬러(Virtual Color) 여야 합니다.

올바른 샘플러 타입을 사용하지 않는 Texture Sample 노드가 있으면 통계(Stats) 패널과 노드 하단에 아래와 같은 오류 메시지가 표시됩니다.

ManualConversionError.png

  1. 오류 메시지에 할당된 VT 텍스처 샘플 표현식의 잘못된 샘플러 타입 이 표시됩니다.

  2. 텍스처 샘플의 샘플러 타입버추얼 타입으로 변경합니다.

  3. VT 텍스처 샘플이 올바르게 렌더링되고, 표현식 우측 하단에 ‘VT'가 표시됩니다.

머티리얼 그래프에 버추얼 텍스처를 추가하면 UE가 버추얼 샘플러 타입을 자동으로 할당합니다. 하지만 표현식을 머티리얼 인스턴스에서 사용할 수 있는 텍스처 샘플 파라미터로 만들 때는 베이스 머티리얼이 버추얼 샘플러 타입을 모든 자손 인스턴스에 적용한다는 점을 유념해야 합니다. 베이스 머티리얼에서 이미 버추얼 타입이 아닌 텍스처 파라미터 슬롯에는 버추얼 텍스처를 할당할 수 없다는 점을 명심하세요.

UDIM 지원

UDIM(U-Dimension)은 스태틱 메시나 스켈레탈 메시 모델의 분리된 UV 영역에 여러 텍스처 이미지를 매핑할 수 있도록 하는 텍스처 명명 규칙입니다. UDIM 명명 규칙을 사용하면 UE가 여러 이미지 파일의 그룹을 하나의 버추얼 텍스처 에셋으로 임포트합니다.

버추얼 텍스처링의 UDIM 지원이 유용한 데에는 몇 가지 이유가 있습니다.

  • 거대한 텍스처가 아니라 분리된 작은 텍스처 여러 개로 작업할 수 있습니다.

  • 각 UDIM 이미지의 해상도가 달라도 되므로 픽셀 밀도가 일정하지 않은 버추얼 텍스처를 사용할 수 있습니다.

예를 들어, 4개의 이미지 파일로 구성된 UDIM 버추얼 텍스처를 임포트하려고 합니다. 2개는 2048x2048, 나머지 2개는 128x128 크기의 텍스처입니다. 이미지들은 2x2 패턴으로 배열되어 있습니다. 버추얼 텍스처는 이 이미지들을 하나의 4098x4098 텍스처인 것처럼 논리적으로 샘플링합니다. UE는 디스크 또는 런타임 메모리 사용량에 영향을 주지 않고 128x128 크기의 이미지를 늘려 2048x2048 이미지와 같은 영역을 채웁니다. 이때 작은 128x128 텍스처로 2048x2048 텍스처 해상도를 채워도 메모리는 소모되지 않습니다.

UDIM 워크플로에 대한 추가 정보는 Foundry의 UDIM 워크플로 튜토리얼을 참조하세요.

아래의 명명 규칙을 따라 프로젝트에서 버추얼 텍스처링에 UDIM 텍스처를 사용해 보세요.

BaseName.####.[지원 이미지 포맷]

예시:

MyTexture.1001.png

이 명명 규칙과 일치하는 이미지를 임포트하면 UE가 소스 폴더를 스캔하여 동일한 BaseName 뒤에 다른 좌표 번호가 붙은 이미지가 더 있는지 스캔합니다. 발견된 이미지의 4자리 숫자는 UE가 해당 이미지를 매핑해야 하는 위치를 정의합니다. 기존 텍스처를 임포트하면 0~1 범위로 메시 UV에 매핑됩니다. 하지만 UDIM 이미지는 자체적으로 정의된 UV 좌표에 따라 UV 0~1 공간에 매핑됩니다.

이 그리드는 이미지 저장에 사용할 수 있는 여러 4자리 좌표에 대한 UV 매핑을 나타냅니다.

UDIM_Grid.png

1001에 있는 이미지에 대한 UV 0~1 맵의 텍스처 이름은 MyTexture.1001.png 가 됩니다. 이 이미지의 루트는 UDIM 인덱스 1001입니다. U 좌표가 1~1이면 MyTexture.1002.png 가 됩니다. V 좌표가 1~2면 MyTexture.1011.png 가 됩니다.

퍼포먼스 및 비용

아래 섹션을 사용하여 프로젝트에서 버추얼 텍스처링의 퍼포먼스와 비용을 측정하세요.

통계 버추얼 텍스처링

키보드의 백틱(`) 키로 콘솔 창을 열고 아래 명령어를 입력하면 통계 정보가 활성화됩니다.

stat virtualtexturing 을 사용하면 밀리초(ms) 단위로 표시되는 버추얼 텍스처링 씬 비용에 대한 상세 내용과 페이지 테이블에 대한 카운터를 볼 수 있습니다.

Stat_VirtualTexturing.png

stat virtualtexturememory 를 사용하면 현재 씬의 버추얼 텍스처링 사용과 관련된 메모리 카운터를 볼 수 있습니다.

Stat_VirtualTextureMemory.png

스트리밍 버추얼 텍스처링 시각화

콘솔 명령어 r.VT.Borders 1 을 사용하면 스트리밍 버추얼 텍스처를 사용하는 머티리얼에 대한 밉 시각화 그리드를 그릴 수 있습니다.

Vis_VTBorders.png

r.VT.Borders 0 을 사용하면 그리드가 필요 없을 때 숨길 수 있습니다.

머티리얼 룩업 및 스택

머티리얼의 버추얼 텍스처 샘플링은 기존 텍스처 샘플링보다 많은 비용이 듭니다. 버추얼 텍스처링의 비용은 두 가지로 나눌 수 있습니다.

  • 룩업(Lookups) 은 머티리얼 그래프에서 프로젝트가 샘플링하는 버추얼 텍스처마다 발생합니다.

  • 스택(Stacks) 은 프로젝트가 동일한 UV와 샘플러 소스를 사용할 때 버추얼 텍스처를 결합합니다.

버추얼 텍스처는 기존 텍스처 샘플보다 항상 많은 비용이 듭니다. 항상 최소 2개의 텍스처 페치와 수학 인스트럭션이 존재할 것입니다. 하지만 이 비용 중 일부는 동일한 UV와 샘플러 소스를 사용하는 VT 텍스처 샘플을 합치는 스택 결합(최대 8개)으로 상환됩니다.

이 단순한 머티리얼 예시에서는 UE가 디폴트 UV를 사용하여 두 개의 VT 텍스처 샘플 표현식을 샘플링합니다. 텍스처 샘플의 각 룩업에는 버추얼 텍스처 룩업(Virtual Texture Lookup) 이 추가되어 있으며, 둘 다 하나의 UV를 사용하므로 하나의 버추얼 텍스처 스택(Virtual Texture Stack) 으로 결합됩니다.

VT_MatStats_1.png

하지만 프로젝트가 다른 UV를 사용한다면 두 개의 버추얼 텍스처 스택 페치로 비용이 증가합니다.

VT_MatStats_2.png

첫 번째 예시에서는 룩업 2개, 스택 1개, 총 3개의 텍스처 페치를 사용합니다. VT 샘플들이 동일한 UV를 사용하므로 UE는 스택을 결합하여 텍스처 페치를 절약합니다. 두 번째 예시에서는 룩업 2개, 스택 2개, 총 4개의 텍스처 페치가 있습니다. VT 텍스처 샘플은 베이스 컬러와 노멀 텍스처 샘플에 다른 UV를 사용합니다. 따라서 하나의 스택으로 결합될 수 없습니다.

머티리얼 추가 참고사항

  • UE는 스트리밍 버추얼 텍스처를 크기와 관계없이 각 텍스처에 대해 고정된 크기의 타일로 분할합니다. 또한 가장 낮은 해상도의 밉을 타일 크기에 따라 제한합니다. 보통 이 방식은 문제가 되지 않습니다. 하지만 노이즈가 많거나 디테일이 높은 텍스처의 경우 저해상도 밉의 부족으로 에일리어싱이나 물결 패턴 현상이 발생할 수 있습니다. 이 경우 GPU 퍼포먼스 비용도 발생할 수 있지만, 실제로는 측정이 어려울 수 있습니다.

한계

일반적으로 버추얼 텍스처는 일반 텍스처와 바꾸어 사용할 수 있지만 몇 가지 한계적인 측면이 있으며 비용이 더 들 수 있습니다.

  • 텍스처 치수는 2의 거듭제곱이어야 하지만 UE 특성상 꼭 정사각형일 필요는 없습니다. 그러나 현재 구현에서는 정사각형 텍스처가 더 효율적으로 메모리를 사용합니다.

  • 밉 간 삼선형(trilinear) 필터링 기능은 확률적 방식으로 이루어집니다. 템포럴 안티 에일리어싱(TAA)을 사용하면 일반 삼선형 필터링과 구별이 거의 불가능하지만, 경우에 따라 노이즈가 보일 수 있습니다.

  • UE는 타일 경계(Tile Border) 세팅을 사용한 애니소트로픽 필터링 지원을 제한합니다. 디폴트 값인 4를 사용하면 일반적인 텍스처보다 덜 애니소트로픽한 필터링이 가능하지만, 이 값을 올리면 메모리 사용량이 늘어납니다.

  • VT 스트리밍은 특성상 선제적으로 작동하지 않습니다. 즉, CPU는 렌더링된 프레임에서 요구하기 전까지 주어진 VT 타일을 로드해야 한다는 것을 알 수 없습니다. 따라서 특히 고해상도 VT 타일을 로드하는 경우 카메라가 씬을 따라 움직일 때 대상이 갑자기 튀어나오는 현상이 발생할 수 있습니다.

언리얼 엔진의 이전 버전을 위해 작성된 페이지입니다. 현재 언리얼 엔진 5 버전을 위해 업데이트되지 않았습니다.