概要
整腸勇者では、CanvasのRenderModeをScreenSpace - Cameraとし、専用のUICameraを用意してBaseCameraのCameraStackとして登録しUIを描画している。この時、BaseCameraではAAの設定としてFXAAを採用していた。すると、なぜかUICameraで撮影されたUIに対してもFXAAが適用されるという問題にぶつかった。TextMeshProで描画していた文字が僅かに荒く描画されていて気付いた。今回はこの問題に対しての解決方法を記録に残す。
FXAAでテキストを描画、このように明らかにピクセルが破綻している。
もちろん、CanvasのRenderModeをScreenSpace - Overlay にすることでこの問題は発生しなくなるが、今回はUIの上に3Dのエフェクトを配置したいという要件があり、ScreenSpace - Camera を採用必要があった。
結論
BaseCameraでFXAAではなく、SMAAを採用すると解決する。(TAAもで可)
設定内容
SMAAでテキストを描画、綺麗にピクセルが描画されるようになった。
CameraStackに影響を与えないFXAAの設定
を、知ってる人がいれば教えて下さい!
詳細
同じような問題にぶつかっている人をネットで見つけることができた。
URP Camera Stack and Anti-Aliasing
ここでも話題としてあがっているが、どうやらFXAAはカメラスタックの描画が全て終わった後でAA処理をしているので、カメラスタックにUICameraを積むと一緒にAAが適用されてしまうとのこと。SMAAにすることで当該カメラだけにAAがかかるので問題は解消する。
他の解決方法としては、CameraStackを用いずにUICameraの内容をオフスクリーンレンダリングして描画するような方法も取れるかもしれないが、今回はSMAAを採用することで解決することとした。
他にもScreenSpace - Overlayにするという方法もあるが、前述した要件があるのに加え、今からUIの構成を変更するのも結構なコストがかかるのでこの選択肢は取れない。
FXAAとSMAA
アンチエイリアシング
つまり、FXAAの方が高速だが、SMAAもモバイルやプラットフォームでも採用することのできるパフォーマンスではあるとのこと。クオリティ的にはSMAAの方に軍配があがるように見える。
AAなし
FXAA
SMAA
環境
Unity2022.3.39f1
以上