UE5.8 の Landscapeで SRVsの使用量が増加した

お世話になっております。

<br/>

Unreal Engine 5.8のランドスケープにおいて、「weightmap の部分レンダリングで top / left / top-left component を考慮する修正」 が入っていいますが、その副作用なのか、

隣接コンポーネントのレイヤーが各コンポーネントのレイヤー割り当てに混入して、結果として Shader is using too many SRVs: 73 (only 64 supported) といった 問題が発生するようになりました。

<br/>

本来、各コンポーネントのレイヤー割り当ては、そのコンポーネント自身にペイントされたレイヤーのみを反映するもので、UE5.7でコンポーネントに割り当てられているレイヤー数とUE5.8で

コンポーネントに割り当てられているレイヤー数は同一となるのが正しいと思いますが、UE5.8では増えていることを確認しております。

<br/>

現在 5.8.2 を使用してい本問題が発生していますが、何か良い修正手段のアドバイスや回避方法の有無等ありますでしょうか?

<br/>

どうぞよろしくお願いいたします。

[Attachment Removed]

再現手順

  1. Edit Layersを使用したWorld Partition Landscapeを作成する。
  2. Landscape Materialには、複数のWeight Blend Layerを使用し、1コンポーネントで10レイヤー前後使用するとSRV上限に近づく程度のテクスチャ参照を含める。
  3. 隣接するLandscape Component間で使用するPaint Layerが異なるようにペイントする。各Component単体ではSRV上限を超えない状態にする。
  4. UE 5.7.xでは正常にMaterialがコンパイル・描画されることを確認する。
  5. コンテンツを変更せずUE 5.8.xへアップグレードし、マップを開くかLandscape Modeに入ってEdit Layerを再計算させる。
  6. UE 5.8.xでは、隣接ComponentのLayerが各ComponentのLayer割り当てに含まれ、使用Layer数とWeightmap数が増加する。
  7. その結果SRV数が64を超え、Landscape Materialのコンパイルに失敗してDefault Materialへフォールバックする。

例:

Shader is using too many SRVs: 73 (only 64 supported)

[Attachment Removed]

頂戴した再現手順​によって本来そのコンポーネントに割り当てられていないはずのレイヤーが隣接するコンポーネントから混入してレイヤー数を増加させている挙動を確認しました。

CL 53528886 で追加された、ランドスケープの部分更新時に隣接するコンポーネントを入力として追加で取り入れて境界部を正しく更新するようにする処理が、本来必要ではないレイヤーの使用フラグにまで及んでマージされてしまっているのが原因でした。

​この問題を回避する設定や既存の修正などは無かったのでエンジンに手をいれていただく必要があります。

ワークアラウンドとしては、以下の様に入力と出力が非対称になっているランドスケープの更新パスで隣接するコンポーネントを除外するという変更が機能しました。

​

UE::Landscape::EditLayers::FMergeRenderContext ALandscape::PrepareEditLayersMergeRenderContext(const UE::Landscape::EditLayers::FMergeContext& InMergeContext, const UE::Landscape::EditLayers::FMergeRenderParams& InMergeRenderParams)
 
...
 
 
					// Iterate on all the required components :
					for (TConstSetBitIterator It(*ComponentsToIterateBitIndices); It; ++It)
					{
						const int32 ComponentToRenderIndex = It.GetIndex();
						FComponentToRenderInfo& ComponentToRenderInfo = AllComponentsToRenderInfos[ComponentToRenderIndex];
						check(ComponentToRenderInfo.Component != nullptr);
 
#if 1 // workaround
						// 入力と出力が非対称になる SpecificComponent 型のパスでは、参照用に取り込まれた隣接コンポーネントを除外する
						const bool bIsOutputComponent = (OutputWorldArea.GetType() != FOutputWorldArea::EType::SpecificComponent)
							|| (ComponentToRenderInfo.Component->GetComponentKey() == OutputWorldArea.GetSpecificComponentKey());
						if (bAffectsOutputLayerBitIndices && bIsOutputComponent)
#else
						if (bAffectsOutputLayerBitIndices)
#endif
						{
							ComponentToRenderInfo.TargetLayerBitIndices.CombineWithBitwiseOR(OutputLayerBitIndices, EBitwiseOperatorFlags::MinSize);
						}
 

​

​

こちらを適用後にランドスケープ編集モードに入ることで問題が改善するはずです。ご確認いただけますでしょうか。​

問題の改善が確認出来たらバグとして登録したいと思います。​

​

修正確認には viewmode > landscape​ > Layer Usage や landscape.DumpTargetLayerAllocations -details コンソールコマンドでのレイヤーのダンプが役立ちます。

​

[Attachment Removed]

ご返答ありがとうございます。

上記修正を行ったEngineで確認したところ、問題が起こることなく動作させることができました。

この後バグとして登録いただくという事ですが、Issuse登録されましたら教えていただけたら幸いです。

ご対応ありがとうございました。

[Attachment Removed]

UE-402265 [Landscape] weightmap layer allocations leak into left/top/top-left neighbor components

としてバグ登録させていただきました。数営業日のちにissues に公開予定ですのでそちらでトラッキングしてください。

[Attachment Removed]