텍스처 스트리밍 데이터 빌드

텍스처 스트리밍 데이터를 빌드하고 그 정확도를 시각화하는 방법입니다.

Choose your operating system:

Windows

macOS

Linux

머티리얼 또는 머티리얼 인스턴스를 변경하여 다시 저장할 때마다 사용된 각 텍스처에 관련된 텍스처 스트리밍 데이터가 재계산됩니다. 텍스처별 데이터에는 UV 채널 인덱스(UV Channel Index)와 스케일(Scale)이 포함되는데, UV 채널 인덱스는 텍스처를 샘플링하는 데 사용되고 스케일은 샘플링에 앞서 채널에 적용하는 배수로 사용됩니다.

하지만 항상 그런 것은 아닙니다. 샘플링은 월드 포지션, 메시 버텍스 컬러, 다양한 UV 채널 조합에 따라 달라질 수 있기 때문입니다. 이때는 분석 시 관련 데이터를 찾을 수 없기 때문에 엔진에서는 종속성이 UV 채널 0과 스케일 1이라고 가정합니다.

분석은 여러 단계에서 실행되며, 편집 중인 대상에 따라 아래와 같이 달라집니다.

  1. 머티리얼: 사용자가 변경사항을 적용 또는 저장하면 실행됩니다.

  2. 머티리얼 인스턴스: 머티리얼 인스턴스 에디터를 닫거나, 머티리얼 인스턴스가 들어있는 패키지를 저장하면 실행됩니다.

  3. 레벨: 사용자가 ‘텍스처 스트리밍 빌드' 명령을 내리면 사용된 모든 머티리얼에 대해 실행됩니다. 모든 머티리얼의 상태를 최신으로 유지하는 데 사용됩니다. 머티리얼이 최신 상태로 유지되지 않는 이유는 다음과 같습니다.

    • 4.15 이전의 머티리얼에 아무 데이터도 없을 때.

    • 머티리얼 부모가 변경되었으나 인스턴스 데이터가 구버전일 때.

    • 이전에 머티리얼을 저장한 이후 개선사항이 있을 때.

    • 버그가 수정되었을 때.

주어진 프리미티브 컴포넌트에 대해 사용되는 각 텍스처의 필요 해상도를 정확히 계산하는 데 필요한 데이터는 다음과 같습니다.

  • 프리미티브의 바운드

  • 메시의 텍스처 좌표 크기

  • 각 텍스처 샘플링을 위한 머티리얼 텍스처 좌표 스케일

이 정보가 없으면, 보수적인 휴리스틱 기법이 사용됩니다.

텍스처 스트리밍 데이터를 빌드하기

  1. 툴바(Toolbar)빌드(Build) 버튼 옆 드롭다운 화살표를 클릭합니다.

  2. 텍스처 스트리밍 빌드(Build Texture Streaming) 를 클릭합니다.

BuildTextureStreaming.png

런타임에서 사용할 컴포넌트와 레벨 데이터를 생성합니다.

BuildingTextureStreaming.png

이렇게 하면 가장 높은 퀄리티의 레벨과 지원되는 피처 레벨을 사용하여, 모든 머티리얼 퀄리티 레벨 및 플랫폼 피처 레벨에서 사용할 데이터를 생성합니다.

런타임에서 컴포넌트가 빌드 프로세스에 사용된 것보다 적은 수의 텍스처를 사용하는 경우, 사용되지 않는 텍스처는 무시됩니다.

4.15로 스트리밍 데이터 이주하기

4.15 이전에 편집한 모든 머티리얼에는 텍스처 스트리밍 데이터가 저장되어 있지 않으므로 수정 후 다시 저장하기 전까지는 데이터가 없을 것입니다. 따라서 머티리얼의 자손 인스턴스도 다시 저장해야 합니다. 데이터를 빠르게 이주하려면 콘솔 명령 `BuildMaterialTextureStreamingData`를 사용하면 됩니다.

이렇게 하면 현재 메모리에 로드된 모든 머티리얼을 파싱하고 누락된 데이터를 생성할 수 있습니다. 업데이트된 머티리얼은 다시 저장할 수 있도록 표시됩니다.

머티리얼 데이터 검사하기

빌드된 데이터는 머티리얼 텍스처 스케일(Material Texture Scales) 뷰 모드에서 검사할 수 있습니다. 이 뷰 모드는 성공적으로 계산된 대상만 보여줍니다. 예비 케이스는 _undefined_로 표시됩니다. 이 뷰 모드는 머티리얼 스케일의 정확도를 알려주며, 분석 시 변경사항을 검증하는 데 사용됩니다. 또한, 머티리얼 텍스처 스케일 뷰 모드는 텍스처 스트리밍과 관련된 퀄리티 문제가 있을 때 잠재적인 원인을 알려줍니다.

머티리얼 텍스처 스트리밍 데이터를 검사하려면 콘텐츠 브라우저(Content Browser) 에서 머티리얼을 선택하거나 씬 뷰에서 프리미티브를 선택하면 됩니다. 메인 뷰포트의 텍스처(Texture) 탭에서 라벨 끝에 ‘(씬 선택(Scene Selection))' 또는 ‘(콘텐츠 브라우저(Content Browser))'를 추가하여 선택 위치를 알 수 있습니다.

씬 선택을 사용하면 개별 머티리얼을 선택할 수 없으며, UI가 모든 머티리얼의 데이터를 그룹화합니다.

NoSelection.png

ContentBrowser.png

SceneSelection.png

선택 없음

콘텐츠 브라우저의 머티리얼

씬 선택 액터

씬 선택

씬 선택 을 사용하면 개별 머티리얼을 선택할 수 없으며, UI가 모든 머티리얼의 데이터를 그룹화합니다. 드롭다운의 텍스처 선택 항목 위로 마우스를 가져가면 툴팁에 나열된 텍스처를 모두 볼 수 있습니다.

SingleSelection.png

MultipleSelection.png

단일 오브젝트 씬 선택

다중 오브젝트 씬 선택

콘텐츠 브라우저 선택

콘텐츠 브라우저 선택을 사용하면 텍스처 인덱스, 머티리얼 이름(머티리얼을 다중 선택한 경우), 텍스처 이름을 바탕으로 텍스처를 식별합니다. 텍스처 인덱스는 각 머티리얼에 포함된 식별자입니다. 표시된 정확도는 사용된 GPU 값과 머티리얼 분석에서 계산된 값을 비교하여 산출된 것입니다.

CB_SingleSelection.png

CB_MultipleSelection.png

단일 머티리얼 콘텐츠 브라우저 선택

다중 머티리얼 콘텐츠 브라우저 선택

모든 텍스처 모드

모든 텍스처(All Textures) 모드에서는 사용된 모든 텍스처에 대해 최악의 경우를 표시해줍니다. 글로벌 값이 정확할 경우(연회색) 모든 텍스처가 정확한 값을 가집니다. 하지만 이 모드에는 한계가 있습니다. 동일한 텍스처를 다양한 스케일로 여러 차례 샘플링하면 보통 오버 스트리밍(over streaming)으로 표시됩니다. 분석에서는 주로 가장 큰 해상도를 요하는 스케일만 사용되고 비교적 작은 해상도를 필요로 하는 스케일은 무시되기 때문입니다. 이 한계는 텍스처별(per-texture) 뷰에는 해당되지 않습니다.

빌드 정확도

텍스처 스트리밍 빌드 도중 계산되는 데이터 정확도는 텍스처 스트리밍 정확도 뷰 모드를 보고 검사할 수 있습니다.

ShowTextureStreamingAccuracies.png

이 뷰 모드에는 빌드된 데이터의 정확도가 표시됩니다. 정확도가 너무 낮거나(빨간색) 높으면(초록색), 수동 환경설정 변경으로 데이터를 고치는 것이 가능한 경우도 있습니다. 텍스처 스트리밍 빌드의 목적은 미세조정할 필요 없이 최적의 데이터를 생성하는 것입니다.

OriginalTextureScene.png

위 그림은 아래에 표시된 텍스처 데이터를 빌드하는 데 사용된 씬을 나타냅니다. 모든 뷰 모드에서 사용되는 범례는 다음과 같습니다.

  • 빨간색: 밉 2배 이상 부족

  • 노란색: 밉 1개 부족

  • 흰색: 양호한 데이터

  • 청록색: 밉 1개 많음

  • 초록색: 밉 2배 이상 많음

프리미티브 거리 정확도

실제 GPU 거리와 비교해 스트리머가 계산한 뷰 메시 거리의 정확도를 표시합니다. 스트리머는 시점에서 텍스처 인스턴스 AABB(축 평형 바운딩 박스)까지의 거리를 계산합니다. 이 바운딩 박스는 빌드 프로세스에서 텍스처를 사용하고 있는 컴포넌트 LOD 섹션 AABB를 더하는 식으로 계산합니다.

시점이 이 AABB에 매우 가까워지거나 AABB에 들어서면 지오메트리가 AABB에 맞지 않는 한, 이 모드에서는 항상 2배 이상으로 표시됩니다. 스트리머의 계산 거리는 0이 되지만 GPU 거리는 보통 0이 아니기 때문입니다. 따라서 스트리머 계산 거리와 GPU 거리 사이 비율이 매우 높아집니다. 이는 오류가 아니며, 현재로서는 수정이 필요하지 않습니다.

PrimitiveDistanceAccuracy.png

여기 표시되는 값은 메시 컴포넌트의 스트리밍 디스턴스 배수(Streaming Distance Multiplier) 를 변경하여 조절할 수 있습니다.

StreamingDistanceMultiplier.png

메시 UV 밀도 정확도

이 뷰 모드에는 실제 GPU 값과 비교해 스트리머가 사용하는 메시 월드 텍스처 좌표(texcoord) 크기의 정확도가 표시됩니다. 이 크기는 월드 스페이스 유닛 단위의 텍스처 좌표 베리에이션과 관계가 있습니다. 스트리머가 텍스처의 샘플링에 대한 텍스처 좌표의 영향력을 평가하는 데 사용됩니다.

UVDensities.png

이 뷰 모드는 시점과는 비교적 무관합니다. 메시에 잘못된 값이 있으면 보통 씬이 아닌 메시와 관련이 있습니다. 즉, 메시에 틀린 데이터가 있으면 그 메시를 사용하는 컴포넌트 또한 부정확할 가능성이 높습니다. 이 값은 스태틱 메시나 스켈레탈 메시 에디터에서 StreamingDistanceMultiplier 값을 조정하여 양호한 범위로 조정할 수 있습니다.

머티리얼 텍스처 스케일 정확도

머티리얼에 사용되는 대부분의 텍스처는 메시 UV 밀도(Mesh UV Densities) 중 하나에 스케일을 적용한 값을 사용하여 샘플링됩니다. 텍스처 스트리밍 빌드는 각각의 샘플링된 텍스처에 어떤 스케일과 텍스처 좌표가 사용되었는지를 계산합니다. 여러가지 이유로 계산에 실패할 수 있는데, 이 경우 스트리머는 텍스처 좌표 0과 스케일 1로 텍스처가 샘플링되었다고 가정합니다.

MaterialTexture.png

표준 범례뿐 아니라 흑백 체커보드도 마찬가지로 빌드가 특정한 이유로 필요한 셰이더를 생성하지 못했다는 것을 나타냅니다. 또한 머티리얼은 여러 텍스처를 샘플링하기 때문에 이 뷰 모드에는 모든 샘플링된 텍스처 중 가장 큰 오차가 표시됩니다. 그 두 극값(언더 스트리밍 및 오버 스트리밍)은 체커보드로 표시되는데, 하나는 최악의 오버샘플링, 다른 하나는 최악의 언더샘플링입니다.

텍스처별 개별 오차는 r.Streaming.AnalysisIndex X 콘솔 명령으로 검사할 수 있습니다. X 값의 범위는 0 에서 31 사이입니다.

요구 텍스처 해상도

이 뷰 모드에서는 현재 스트리밍된 텍스처 해상도와 요구되는 텍스처 해상도 사이의 관계를 표시할 수 있습니다.

RequiredTextureRes.png

이 뷰 모드는 머티리얼 텍스처 스케일과 유사한 점이 있으나, 텍스처 스트리밍 데이터 정확도 대신 절대적인 방식으로 현재 로드된 텍스처 해상도의 유용성을 표시합니다.

한 텍스처에 대해 특정 시점에서 로드된 해상도는 로직과 지표의 조합으로 결정됩니다. 예를 들어 텍스처가 누락되는 것은 텍스처를 로드할 공간이 충분하지 않기 때문일 수도 있고, 높은 밉이 향후 사용을 위해 텍스처 풀에 캐시되어 있어서 해상도가 지나치게 높기 때문일 수도 있습니다. 또한, 스트리머는 보통 최고 해상도를 요하는 컴포넌트에 의해 구동되므로 한 컴포넌트의 텍스처 행동을 검사하는 것은 그 컴포넌트가 그 해상도를 구동하는 경우에만 의미가 있습니다.

그러므로 이 뷰 모드는 제어된 환경의 텍스처 스트리머 행동을 검사할 때 사용하는 것이 좋습니다. 유용한 설정은 아래와 같습니다.

r.Streaming.DropMips 2

이렇게 하면 스트리머가 보이는 밉만 유지하여 캐시와 프리페칭을 비활성화합니다. 카메라를 움직여 보면 스트리머가 적절한 시점에 올바른 밉을 로드/언로드하는 것이 보일 것입니다.

선택된 컴포넌트 머티리얼에 선택된 텍스처가 32개 미만인 경우, 텍스처 선택 메뉴에 텍스처별 선택이 제공됩니다. 이런 식으로 텍스처를 선택하면 해당 텍스처를 사용하는 모든 씬 컴포넌트에 표시됩니다.

RequiredRes_TextureSelection.png

한계 & 알려진 문제

  • 분석에서 모든 머티리얼을 지원하는 것은 아닙니다. 현재 데칼 및 랜드스케이프 머티리얼은 지원되지 않습니다. 엔진에서 분석에 사용되는 셰이더 생성에 실패하는 경우도 있습니다. 이때 프리미티브는 균일한 진회색으로 표시됩니다. log TextureStreamingBuild level all 명령으로 모든 문제의 상세 로그를 켤 수 있습니다.

  • 머티리얼 인스턴스에 폐기된 데이터가 있을 수 있습니다. 부모를 변경하고 다시 저장했으나 자손 인스턴스는 다시 저장하지 않은 경우입니다. 텍스처 스트리밍 데이터는 머티리얼에 저장되는데, 부모 머티리얼을 변경해도 자손 머티리얼 인스턴스가 자동으로 다시 저장되지는 않기 때문입니다.

  • 엔진은 런타임에서 텍스처 이름으로 머티리얼 스트리밍 데이터에 접근합니다. 런타임에서 에셋에 대한 하드 레퍼런스를 방지하고 퍼포먼스를 높이기 위한 것입니다. 즉, 하나의 머티리얼에 이름이 같은 다수의 텍스처를 사용하는 경우, 양쪽 데이터에서 오는 요구 해상도는 양쪽 텍스처에 모두 적용됩니다.

  • 머티리얼 텍스처 스케일 뷰 모드에 사용되는 셰이더는 지속성이 없으므로 셰이더 컴파일이나 맵 로드와 같은 특정 작업을 하는 경우 누락되거나 삭제될 수 있습니다. 뷰 모드를 다시 선택하면 없어진 셰이더가 재생성됩니다.