[심각] 5.7.4 to 5.8.1 마이그레이션 후 랜드스케이프 편집(레이어 가중치)에 애로사항이 있음

제공드린 두 버전을 실행하여 영상처럼 레이어를 페인팅 해보시면 됩니다.

5.8.1 랜드스케이프 편집 환경이 전반적으로 문제가 많아 보입니다.

<br/>

1 빼기 블랜드 페인팅 시 레이어 토탈 가중치 1 유지가 안됨.

2 랜드스케이프 컴포넌트를 하나의 레이어로 가득 채워도 나머지 레이어가 남아있음.(셰이더 레이어 블랜드에 불필요 연산 추가)

<br/>

업무에 치명적인 사항이므로 빠르게 대응해주셨으면 좋겠습니다.

[Attachment Removed]

재현 방법

제공드린 두 버전을 실행하여 영상처럼 레이어를 페인팅 해보시면 됩니다.​

5.8.1 랜드스케이프 편집 환경이 전반적으로 문제가 많아 보입니다.

​

1 빼기 블랜드 페인팅 시 레이어 토탈 가중치 1 유지가 안됨.​

2 랜드스케이프 컴포넌트를 하나의 레이어로 가득 채워도 나머지 레이어가​ 남아있음.(셰이더 레이어 블랜드에 불필요 연산 추가)

​

업무에 치명적인 사항이므로 빠르게 대응해주셨으면 좋겠습니다.

[Attachment Removed]

안녕하세요.

제공해 주신 샘플 프로젝트를 확인한 결과, 말씀해 주신 두 현상은 UE 5.8에서 Landscape 레이어 페인팅 방식이 변경되면서 나타나는 동작으로 확인됩니다.

UE 5.7에서는 한 레이어를 칠하거나 지울 때, 같은 Weight Blend 그룹의 다른 레이어 가중치도 함께 조정하여 전체 합계가 1.0이 되도록 유지했습니다.

다만 레이어를 지울 때 줄어든 가중치를 어느 레이어에 넘겨야 하는지 명확한 기준이 없어, 엔진이 컴포넌트별로 대체 레이어를 선택해야 했습니다.

이 때문에 한 컴포넌트에서는 특정 레이어가 증가하고 인접한 컴포넌트에서는 다른 레이어가 증가하는 등 의도하지 않은 결과가 발생할 수 있었습니다.

UE 5.8에서는 이러한 문제를 방지하기 위해 기존의 자동 재분배 방식을 제거하고, 사용자가 Exclusive Paint를 통해 레이어를 편집하도록 변경되었습니다.

이에 따라 Subtractive Blend 페인팅 시에는 선택한 레이어의 가중치만 감소하고, 같은 Weight Blend 그룹의 다른 레이어 가중치는 자동으로 증가하지 않습니다.

선택 레이어를 지운 뒤에도 다른 레이어에 가중치가 남아 있다면, 최종 합성 단계에서 남아 있는 가중치의 비율을 기준으로 정상적으로 표시할 수 있습니다.

하지만 해당 위치의 모든 레이어 가중치가 0이 되면 계산할 값이 없으므로, 그 위치가 검게 표시됩니다.

Exclusive Paint는 아래 5.8 릴리즈 노트 공식 문서의 Landscape mode Paint tools: New exclusive paint mode for weight-blended layers 항목을 참고하시면 좋을 것 같습니다.

Unreal Engine 5.8 Release Notes | Unreal Engine 5.8 Documentation | Epic Developer Community

컴포넌트를 하나의 레이어로 완전히 채워도 다른 레이어가 남는 현상은 사용하지 않는 레이어의 할당 정보가 정리되지 않아 발생합니다.

Layer Usage는 해당 컴포넌트에 내부적으로 할당된 레이어 수를 표시합니다.

UE 5.7에서는 한 레이어로 완전히 채우면 사용하지 않게 된 다른 레이어의 할당 정보까지 함께 정리했습니다.

UE 5.8에 반영된 변경에서는 기존의 명시적인 할당 정리 과정이 제거되었습니다.

따라서 선택한 레이어를 100%로 채워 화면에는 하나의 레이어만 보이더라도, 다른 레이어의 할당 정보가 남아 Layer Usage가 3으로 유지될 수 있습니다.

엔진에는 최종 Weightmap에서 완전히 비어 있는 레이어 할당을 제거하는 다음 옵션이 존재합니다.

landscape.RemoveEmptyPaintLayersOnEdit엔진 코드의 TODO 주석에 따르면, 이 기능을 활성화할 경우 이미 정리된 레이어 할당을 합성 과정이 다시 생성했다가 합성 결과 확인 후 다시 삭제하는 왕복이 레벨을 열 때마다 반복되어,

열기만 해도 Landscape가 변경된 것으로 인지하여 dirty 상태가 되는 문제가 있어 비활성화해 둔 것으로 보입니다.

감사합니다.

[Attachment Removed]

엔진 코드의 TODO 주석에 따르면, 이 기능을 활성화할 경우 이미 정리된 레이어 할당을 합성 과정이 다시 생성했다가 합성 결과 확인 후 다시 삭제하는 왕복이 레벨을 열 때마다 반복되어,

열기만 해도 Landscape가 변경된 것으로 인지하여 dirty 상태가 되는 문제가 있어 비활성화해 둔 것으로 보입니다.

​

위 내용에 대한 이슈업 및 타겟픽스​가 설정되어 있나요?

[Attachment Removed]

안녕하세요.

앞서 안내드린 컴포넌트를 하나의 레이어로 채워도 Layer Usage가 줄지 않는 문제에 대해 추가로 확인하여, 대응 방안에 대해 안내드리겠습니다.

이 현상은 사용하지 않게 된 레이어의 할당 정보가 정리되지 않아 발생하며, 엔진에는 이를 정리하는landscape.RemoveEmptyPaintLayersOnEdit 옵션이 있습니다.

다만 이 옵션은 UE 5.4부터 기본적으로 비활성화되어 있습니다.

활성화할 경우, 편집 레이어를 다시 합성하는 과정에서 비어 있는 할당이 재생성되었다가 제거되는데, 이 제거가 항상 저장이 필요하다고 판단하여 dirty로 처리됩니다.

그 결과 맵을 열거나 Landscape 모드에 들어가기만 해도 편집하지 않은 맵이 변경 상태가 되었습니다.

옵션이 기본 비활성화된 것도 이 때문입니다.

이에, 옵션을 활성화하더라도 위와 같은 불필요한 변경 상태가 발생하지 않도록 하는 임시 우회코드를 안내 드립니다.

수정 후에도 비어 있는 할당은 동일하게 제거하되, 저장이 필요한 변경으로 표시하는 것은 사용자가 실제로 편집한 경우로 한정했습니다.

페인팅과 같은 실제 편집은 원본 데이터를 변경하면서 이미 변경 상태를 만들므로, 정리 결과가 그 편집과 함께 저장됩니다.

반면 맵을 열거나 모드를 전환하는 자동 재계산에서는 변경 상태가 발생하지 않습니다.

수정 위치는 Engine/Source/Runtime/Landscape/Private/LandscapeEditLayers.cpp의 ALandscape::UpdateForChangedWeightmaps() 이며,

비어 있는 할당을 제거하기 전에 저장 표시 여부를 판단하는 조건을 추가하고, 제거 함수에 그 값을 전달하도록 변경했습니다.

// 기존
 
if (!ComponentReadbackResult.AllZeroLayers.IsEmpty())
{
    // ... AllZeroLayerIndex 검색 
    check(AllZeroLayerIndex != INDEX_NONE);
 
    ComponentReadbackResult.LandscapeComponent->DeleteLayerAllocation(FGuid(), AllZeroLayerIndex, /*bShouldDirtyPackage = */true);
}
 
// 수정
 
const ULandscapeComponent* Component = ComponentReadbackResult.LandscapeComponent;
 
const bool bShouldDirtyPackage = Component->GetUserTriggeredChangeRequested()
|| (Component->GetPackage()->IsDirty() && Component->GetLandscapeProxy()->GetPackage()->IsDirty());
 
if (!ComponentReadbackResult.AllZeroLayers.IsEmpty())
{
    // ... AllZeroLayerIndex 검색 ...
    check(AllZeroLayerIndex != INDEX_NONE);
 
    ComponentReadbackResult.LandscapeComponent->DeleteLayerAllocation(FGuid(), AllZeroLayerIndex, bShouldDirtyPackage);
}

마지막으로, 해당 문제와 관련하여 비공개 티켓이 등록되어 있음을 내부적으로 확인하였으며, 담당자에게도 위 내용을 다시 한번 전달하였습니다.

감사합니다.

[Attachment Removed]

내용 확인해보겠습니다.

[Attachment Removed]