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

Vulkan スワップチェーンの回転

アプリケーションのフレームバッファの向きが、ディスプレイのネイティブな向き (ほとんどのデバイスでは縦向き) と一致しない場合、Android では、描画されたフレームが画面に表示されるたびに、追加の回転を適用する必要があります。この追加の回転は、デバイスのハードウェア性能によっては、パフォーマンス上のコストがかかる場合があります。

大抵は、レンダリング中にこの回転を適用しても、オーバーヘッドはほとんどありません。これを行うには、Android の [Player Settings(class-PlayerSettingsAndroid) (PlayerSettings.vulkanEnablePreTransform 参照) に移動し、Apply display rotation during rendering を有効にします。

ノート: 回転は、Unity がバックバッファに直接レンダリングするときにのみ適用されます。レンダーテクスチャへのレンダリング時には効果がありません。

回転を適用するために、Unity は射影行列 (UNITY_MATRIX_MVP, UNITY_MATRIX_P) を修正します。つまり、回転自体が頂点シェーダーで適用されます。

preTransform の設定は、Unity の C# API の動作には影響しません。例えば、 Screen.width の値は、preTransform の設定のために変更されることはありません。また、ビューポートや scissor rect についても同様です。Unity はこれらを必要に応じて調整し、Grab Pass、ReadPixels、Screenshot などのバックバッファからのリードバック操作も処理します。

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

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

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

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

  • UNITY_DISPLAY_ORIENTATION_0
  • UNITY_DISPLAY_ORIENTATION_90
  • UNITY_DISPLAY_ORIENTATION_180
  • UNITY_DISPLAY_ORIENTATION_270

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

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

既知の制限

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

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

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

参考資料

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