ディザLODの切り替わりに画角が考慮されていない

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

ディザLODの切り替わりに画角が考慮されていないため画角の変更でディザ処理が行われません。

この状態で通常のカメラ移動でのディザ処理と画角変化によるLOD切り替わりが重なると、ディザ処理中に切り替わりがパカつくことがあります。

既にメインストリームはNaniteに移行しているのでLOD自体レガシーな機能かもしれませんが、まだ使用する機会はありそうですのでご連絡させていただきます。

以前修正したときはLODDistanceFactor及びProjectionMatrixのテンポラル化が行われていないことが原因で、以下の対応を行うことで正しく動作するようになりました。

  • FTemporalLODStateにView.LODDistanceFactorとView.ViewMatrices.GetProjectionMatrix()の履歴を保持する
    • View.LODDistanceFactorは現在の画角とDefaultFOVとの割合でScreenSizeのスケールに使用されているのでこちらの対応も必要でした
  • ComputeTemporalLODBoundsScreenRadiusSquared()で使用されているView.ViewMatrices.GetProjectionMatrix()をテンポラル化した処理に置き換える
    • return ComputeBoundsScreenRadiusSquared(Origin, SphereRadius, View.GetTemporalLODOrigin(SampleIndex), View.GetTemporalProjectionMatrix(SampleIndex));
  • ComputeTemporalStaticMeshLOD()で使用されているView.LODDistanceFactorをテンポラル化した処理に置き換える
    • const float ScreenSizeScale = FactorScale * View.GetTemporalLODDistanceFactor(SampleIndex);

[Content removed]

再現手順

  • DitherTest2.zipを展開してNewMap2をPIEします
  • シーケンサーで画角変更が行われますがディザ処理は行われません(DitherTest - FOV only.mp4)
  • NewMap3をPIEします
  • カメラ移動によるディザと画角によるLOD切り替わりが同時に行われるとパカつきます(DitherTest - FOV and Move.mp4)

プロジェクトではBasicShapesのCubeをコピーしてLOD化してあります。

LOD0 … Screen Size 1

LOD1 … Screen Size 0.25

LOD2 … Screen Size 0.1

また、マテリアルはDitherMatにDithered LOD Transitionのチェックを有効化してあります。

よろしくお願いいたします。

(下記のリンク先は、本スレッドを英語に翻訳した英文スレッドですが、Epic Games のサポートチームが内部的に使用するものですので、ユーザーの方に利用していただく必要はございません。サポートは、この日本語スレッドに日本語で表示されることになります。)

[[Report] Issue where Dithering LOD transition does not consider [Content removed]

(以下は、サポート担当の Lapere Sam によるコメントを翻訳したものです。)

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

本件問題を報告していただきまして、ありがとうございます。また、再現用のプロジェクトも、ありがとうございます。Epic Games 内部でバグ レポートを提出しましたので、問題追跡システムに公開され次第、こちらにリンクを掲載いたします。これによって問題解決への進捗状況が追跡できるようになります。

(以下は、サポート担当の Lapere Sam によるコメントを翻訳したものです。)

本件問題は、公開の問題追跡システムでその進捗を確認できるようになりました。このリンクを使ってください。