Version: 2022.1
言語: 日本語
Android 向けシングルパスステレオレンダリング
テストとデバッグ

フレームバッファの向き

アプリケーションのフレームバッファの向きがデバイスの元からのディスプレイの向き (ほとんどのデバイスでは縦) と一致しない場合、Android はアプリケーションのフレームバッファをフレームごとに、デバイスのディスプレイに合わせて回転させます。デバイスのハードウェア機能によっては、この追加の回転がパフォーマンスに悪影響を及ぼすことがあります。アプリケーションが Vulkan Graphics API を使用し、デバイスが Vulkan をサポートする場合、Unity はレンダリング中にこの回転を適用し、回転によるパフォーマンスへの影響を軽減することができます。これは pre-rotation (事前回転) と呼ばれます。

Unity で事前回転を使用

Unityに事前回転を適用させるには、C# スクリプトまたは Unity エディータを使用します。

  • C# スクリプトによる方法: PlayerSettings.vulkanEnablePreTransformtrue に設定します。

  • Unityエディターによる方法:

  • Edit > Project Settings を選択します。

  • Project Settings ウィンドウで Player タブを選択し、Android の Player 設定 (下の画像) を開いてください。

  • Other Setting セクションで、Apply display rotation during rendering を有効にします。

Unity が事前回転を適用する方法

Unity は、レンダリングテクスチャ にレンダリングするときではなく、デバイスのバックバッファに直接レンダリングするときに、事前回転を適用します。回転を適用するために、UNITY_MATRIX_MVPUNITY_MATRIX_P ビルトインシェーダー変数 に影響する投影行列が変更されます。つまり、Unity は頂点シェーダーで回転を適用します。

事前回転を使用しても、Unity の C# API の動作には影響しません。例えば、画面の幅にアクセスするには、Screen.width を使用できます。ビューポートや シザー矩形 も同様です。Unity は必要に応じてこれらを調整し、Grab Pass、ReadPixels、Screenshot などのバックバッファからのリードバック操作も処理します。

Unity では、シェーダーの特殊なケースに対応するためのユーティリティマクロを用意しています (詳細は、後述の 制限 のセクションを参照してください)。

マクロ UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION は、以下の条件がすべて真である場合にのみ定義されます (そうでない場合は未定義です)。

  • preTransform が Player 設定で有効になっていること。
  • プラットフォームが Android に設定されていること。
  • グラフィックス API が Vulkan に設定されていること。

UNITY_DISPLAY_ORIENTATION_PRETRANSFORM は定数で、現在の preTransform 回転に設定されます。その値は以下のいずれかです。

  • UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_0
  • UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_90
  • UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_180
  • UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_270

UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION が未定義の場合、またはレンダーテクスチャにレンダリングする場合、UNITY_DISPLAY_ORIENTATION_PRETRANSFORM の値は UNITY_DISPLAY_ORIENTATION_0 です。

UNITY_DISPLAY_ORIENTATION_PRETRANSFORM は、Vulkan の特殊化定数に変換されているので、if や switch 文で使用すると効率的です。

制限

以下のケースでは、preTransform を有効にするために、Unity プロジェクトに追加の修正が必要になる可能性があります。

  • Unity の射影行列を使わないシェーダー
  • フラグメントシェーダーの現在のピクセル位置に依存するシェーダー (SV_Position)。
  • スクリーンスペース派生物 (ddx, ddy) を使用するシェーダー。
  • Vulkan スワップチェーン画像を使用するネイティブのレンダリングプラグインの修正が必要かもしれない場合。
  • 他のレンダーテクスチャと一緒に MRT 設定で Unity RenderPass API でバックバッファを使用する場合。

これらのケースは、バックバッファに直接レンダリングする場合にのみ適用されます。

参考資料

Android 向けシングルパスステレオレンダリング
テストとデバッグ