[UE4] LOD를 시각화하는 명령

1. 개요



LOD를 확인하는 콘솔 명령을 소개합니다.
디버그나 LOD의 각 파라미터의 조정시 등에 유용합니다.

2. 명령



2.1. a.VisualizeLODs 1



LOD에 현재 어떤 값이 적용되는지 확인할 수 있는 콘솔 명령입니다.

・본수, 정점수도 확인할 수 있어 Shipping/Test 이외의 빌드로 유효
・SkinnedMeshComponent를 계승한 Component에게만 시각화가 가능
・표시색은 아래와 같이 소스상에 하드코드로 정의


LOD
Color


LOD0
화이트

LOD1
그린

LOD2
Yellow

LOD3
레드

기타
Purple




다음 위치에서 구현됩니다.

SkinnedMeshComponent.cpp

bool USkinnedMeshComponent::UpdateLODStatus_Internal(int32 InMasterPoseComponentPredictedLODLevel)
{
    //...
    if (CVarAnimVisualizeLODs.GetValueOnAnyThread() != 0)
    {
        // Reduce to visible animated, non SyncAttachParentLOD to reduce clutter.
        if (SkeletalMesh && MeshObject && bRecentlyRendered)
        {
            const bool bHasValidSyncAttachParent = bSyncAttachParentLOD && GetAttachParent() && GetAttachParent()->IsA(USkinnedMeshComponent::StaticClass());
            if (!bHasValidSyncAttachParent)
            {
                const float ScreenSize = FMath::Sqrt(MeshObject->MaxDistanceFactor) * 2.f;
                FString DebugString = FString::Printf(TEXT("PredictedLODLevel(%d)\nMinDesiredLODLevel(%d) ForcedLodModel(%d) MinLodIndex(%d) LODBias(%d)\nMaxDistanceFactor(%f) ScreenSize(%f)"),
                    PredictedLODLevel, MeshObject->MinDesiredLODLevel, LocalForcedLodModel, MinLodIndex, LODBias, MeshObject->MaxDistanceFactor, ScreenSize);

                // See if Child classes want to add something.
                UpdateVisualizeLODString(DebugString);

                FColor DrawColor = FColor::White;
                switch (PredictedLODLevel)
                {
                case 0: DrawColor = FColor::White; break;
                case 1: DrawColor = FColor::Green; break;
                case 2: DrawColor = FColor::Yellow; break;
                case 3: DrawColor = FColor::Red; break;
                default:
                    DrawColor = FColor::Purple; break;
                }

                DrawDebugString(GetWorld(), Bounds.Origin, DebugString, nullptr, DrawColor, 0.f, true, 1.2f);
            }
        }
    }
    //...
}


2.2. ShowFlag.LODColoration 1



현재 적용되어 LOD를 LOD 레벨별 색상으로 확인할 수 있는 콘솔 명령입니다.

· 모든 PrimitiveComponent에 유효
· 표시 색은 다음과 같이 정의 (BaseEngine.ini의 LODColorationColors 참조)


LOD
Color


LOD0
화이트

LOD1
레드

LOD2
그린

LOD3
블루

LOD4
Yellow

LOD5
Fuchisia

LOD6
Cyan

LOD7
Purple




다음 위치에서 구현됩니다.

SkinnedMeshComponent.cpp

void ApplyViewModeOverrides(
    int32 ViewIndex,
    const FEngineShowFlags& EngineShowFlags,
    ERHIFeatureLevel::Type FeatureLevel,
    const FPrimitiveSceneProxy* PrimitiveSceneProxy,
    bool bSelected,
    FMeshBatch& Mesh,
    FMeshElementCollector& Collector
    )
{
#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST)
    // ...
    else if (EngineShowFlags.LODColoration)
    {
        if (!Mesh.IsTranslucent(FeatureLevel) && GEngine->LODColorationColors.Num()  > 0)
        {
            int32 lodColorationIndex = FMath::Clamp((int32)Mesh.VisualizeLODIndex, 0, GEngine->LODColorationColors.Num() - 1);

            bool bLit = Mesh.MaterialRenderProxy->GetMaterial(FeatureLevel)->GetShadingModels().IsLit();
            const UMaterial* LODColorationMaterial = (bLit && EngineShowFlags.Lighting) ? GEngine->LevelColorationLitMaterial : GEngine->LevelColorationUnlitMaterial;

            auto LODColorationMaterialInstance = new FColoredMaterialRenderProxy(
                LODColorationMaterial->GetRenderProxy(),
                GetSelectionColor(GEngine->LODColorationColors[lodColorationIndex], bSelected, PrimitiveSceneProxy->IsHovered() )
                );

            Mesh.MaterialRenderProxy = LODColorationMaterialInstance;
            Collector.RegisterOneFrameMaterialProxy(LODColorationMaterialInstance);
        }
    }
    // ...
}


3. 정리



실제 기계에서 빠르게 LOD가 들어 있는지, 어떤 LOD가 적용되고 있는지를 확인할 때 유용합니다.
이들을 잘 활용하여 디버깅을 효율적으로 수행합시다.

좋은 웹페이지 즐겨찾기