お世話になっております。
ディザ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のチェックを有効化してあります。
よろしくお願いいたします。