Meta QuestなどのスタンドアロンVR向け開発において、描画負荷(GPU負荷)を抑えてパフォーマンス(フレームレート)を維持するために、Fixed Foveated Rendering (以下、FFR) は極めて重要な機能です。しかし、FFRを単純に有効化(高レベルに固定)すると、画面の端(視野外周)の解像度が極端に荒くなり、プレイヤーが視線を少し動かしただけでギラギラとしたモザイク状の激しいジャギー(解像度の崩れ)が目立ってしまうバグ(あるいは不快な視覚現象)が発生します。

本記事では、このFFRによる外周解像度の急激な崩れを抑えつつ、Questのパフォーマンス向上を両立させるための「Dynamic FFR」による動的制御手法と具体的な実装手順を解説します。

初心者向け:この問題を現実で例えると?

FFRの仕組みとこの問題を、私たちの「目の仕組み」と「すりガラス」に例えてみましょう。

人間は、何かを見つめる時、視野の中心にあるものははっきりと見えますが、視界の端(外周)にあるものはぼんやりとしか認識していません。VRのFFRもこれと同じで、プレイヤーが見つめているレンズの中心は超高画質で描き、見つめていない端のほうはわざと画質を落として描画負荷を節約しています。

しかし、この画質を落とす設定を常に「最大」にしていると、視界の端が「少しぼやけている」のを通り越して「すりガラスや大きなドットモザイクを貼り付けた状態」になってしまいます。少し目を動かしただけで、視界の隅のギラギラしたドットが目に入り、VR酔いや没入感の低下を引き起こします。これを解決するために、GPUが忙しい時(高負荷時)だけすりガラスを濃くし、処理が軽い時は透明で綺麗な状態に戻すという自動調節器(Dynamic FFR)を導入します。

不具合の症状と具体的な現象

FFRによる外周解像度の崩れが発生した場合、以下のような症状が見られます。

  • レンズの外周部分(特に画面の四隅)が、昔のレトロゲームのような粗いドット絵状に表示され、滑らかなグラデーションが階段状のモザイクになる。
  • 頭を動かした際、周辺視野の粗いピクセルが明滅(フリッカー)し、目が非常に疲れやすくなる。
  • エディタ再生時には問題がないが、Meta Questの実機にビルドしてAPKを動かした瞬間にのみ発生するため、開発後期まで見落とされやすい。

想定される原因:なぜ解像度が崩れすぎるのか?

FFRは、画面をいくつかの領域(中心・中間・外周)に分割し、外周部分のピクセルシェーダーのサンプリング周波数を下げることでGPUの処理能力を稼ぎます。Questの設定でFFRのレベルを HighHigh Top などの固定値に設定すると、シーンの負荷状態にかかわらず常に外周の解像度が強制的に最低レベルまで引き下げられます。

特に、UI要素が画面端に配置されているゲームや、テキスト情報が外周付近にある場合、FFRの固定設定のせいで文字が完全に潰れて読めなくなってしまいます。また、ポストエフェクトやライトの当たり方によっては、解像度の低下した境界線が白く光って目立つ現象(アーティファクト)が発生しやすくなります。

具体的な解決方法とアプローチ

この問題を解決するには、C#スクリプトを用いて、現在のフレームの処理負荷(GPU負荷)に応じてFFRの強さを動的に変動させる Dynamic FFR を有効化します。これにより、処理に余裕がある通常時は綺麗な画質を保ち、負荷が上がってフレームレートが落ちそうになった瞬間だけ自動でFFRのレベルを引き上げてカクつきを防ぎます。

1. C#による Dynamic FFR の制御実装

Meta XR SDK(Oculus Integration)が提供する OVRManager クラスを使用し、シーン初期化時に以下の動的制御コードを適用します。

using UnityEngine;

public class VRPerformanceController : MonoBehaviour
{
    void Start()
    {
        // FFRの動的制御(Dynamic FFR)を有効化
        OVRManager.fixedFoveatedRenderingDynamic = true;

        // 許容する最大FFRレベルを「Medium」に設定し、外周が崩れすぎるのを防ぐ
        OVRManager.foveatedRenderingLevel = OVRManager.FoveatedRenderingLevel.Medium;
        
        Debug.Log($"Dynamic FFR Enabled. Level limit set to: {OVRManager.foveatedRenderingLevel}");
    }
    
    void Update()
    {
        // 開発中のデバッグ用:現在の実際のFFRレベルをログで監視する
        #if UNITY_EDITOR || DEVELOPMENT_BUILD
        if (Input.GetKeyDown(KeyCode.F))
        {
            var currentLevel = OVRManager.foveatedRenderingLevel;
            Debug.Log($"Current FFR Active Level: {currentLevel}");
        }
        #endif
    }
}

2. URPパイプライン設定の調整

Oculusの設定だけでなく、URPの設定でもアンチエイリアス(MSAA)を適切に効かせることで、FFR適用エリアの境界線を滑らかに補間できます。URP Assetの設定で Anti-aliasing (MSAA)4x 以上に設定することをお勧めします。

実務で役立つ確認チェックリスト

VRプロジェクトのビルド前に、FFR設定が最適であるかを確認するためのリストです。

チェック項目 理想的な設定と対策
FFRの動作モード fixedFoveatedRenderingDynamictrue になっているか(C#での動的割当の保証)。
最大レベルの制限 画質崩れが酷い場合は foveatedRenderingLevelHigh ではなく Medium または Low に制限する。
UIのセーフエリア 重要なUI(体力ゲージやミニマップ)は画面外周ギリギリを避け、少し中央寄りに配置されているか。

まとめ

Meta Questの描画パフォーマンスを維持するためにFFRは必須ですが、過剰な設定はユーザーの視覚体験を著しく損ないます。OVRManager を用いてDynamic FFRを有効にし、状況に応じた動的スケーリングを行うことで、高い画質美と滑らかなフレームレートの両立をスマートに実現しましょう。