固定中心窩レンダリング Fixed Foveated Rendering (FFR) を学ぶ
Fixed Foveated Rendering (FFR) とは
FFRを用いることで,画面のエッジ側のテクスチャが中心より低解像度でレンダリングされるようになる. 周辺のテクスチャの解像度については殆ど感知されないため, FFRをうまく利用すればコッソリGPUを減らすことができ,パフォーマンスが上がる.
Fixed Foveated Rendering (FFR)
FFR 設定方法
任意のスクリプトに
// レベル0 OVRManager.tiledMultiResLevel = OVRManager.TiledMultiResLevel.Off; // レベル1 OVRManager.tiledMultiResLevel = OVRManager.TiledMultiResLevel.LMSLow; // レベル2 OVRManager.tiledMultiResLevel = OVRManager.TiledMultiResLevel.LMSMedium; // レベル3 OVRManager.tiledMultiResLevel = OVRManager.TiledMultiResLevel.LSMHigh; // レベル4 OVRManager.tiledMultiResLevel = OVRManager.TiledMultiResLevel.LSMHighTop;
と書くことでFFRの影響度を設定可能になる.
こちらのスライドのP28からFFRの範囲の広がり具合がわかる.
www.slideshare.net
任意のタイミングで呼び出せるため,重くなる場所でFFRを設定して,再度戻す手法も出来る.
Oculusドキュメントではベストプラクティスの例として,このように書いてある.
シンプルかつ効果的な例として、パフォーマンスヘッドルームに余裕があり多くのテキストエレメントが表示されるメニュー画面ではFFRをオフにし、パフォーマンスが必要なゲームが読み込まれたらFFRをオンにする方法があります。 もう1つの例として、屋外のシーンではFFRをMediumかLowに設定し、洞窟やトンネルなど暗めのレベルに入ったときにHighに切り替え、再び屋外のレベルに戻ったときにMediumに戻すという方法もあります。
レベル2のMediumが標準で,もっとパフォーマンスが必要になったら(つまりGPU負担を減らしたくなったら), レベル3,4のHigh,HighTopと設定する.
"Dynamic" Fixed Foveated Rendering
固定中心窩レンダリング(Fixed Foveated Rendering)の度合いを負荷に応じて変動させる機能が次verに搭載らしいが、「動的固定中心窩レンダリング」って矛盾して聞こえるな…。「固定」てのはアイトラッキングしないで高解像度部を画面中心部に固定するって意味なんだけども。 https://t.co/AuJQ3jgF1Y
— Kenji Iguchi (@needle) 2019年12月21日
元々FFRを適用する度合いはLow/Med/High/HighTopの中からアプリ開発者側が選んで適宜切り替えることができるようになってましたが、ここで言う Dynamicというのはその切り替えをシステム側が自動で行うという事かと思います
— Kenji Iguchi (@needle) 2019年12月22日
Oculus Integration 14.0 以降から,システム側が自動で行うことができるように設定できるようになっている. デフォルトではOFFなので,利用したい場合はONに設定する必要がある.OVRManagerに以下のスクリプトが追加されている.
/// <summary> /// Let the system decide the best foveation level adaptively (Off .. fixedFoveatedRenderingLevel) /// This feature is only supported on QCOMM-based Android devices /// </summary> public static bool useDynamicFixedFoveatedRendering { get { if (!OVRPlugin.fixedFoveatedRenderingSupported) { Debug.LogWarning("Fixed Foveated Rendering feature is not supported"); } return OVRPlugin.useDynamicFixedFoveatedRendering; } set { if (!OVRPlugin.fixedFoveatedRenderingSupported) { Debug.LogWarning("Fixed Foveated Rendering feature is not supported"); } OVRPlugin.useDynamicFixedFoveatedRendering = value; } }
終わりに
適材適所にFFRを用いて,Oculus VR アプリの没入感を高めていこうぜ.