フレームバッファの向き
Explains how to manually match the application's frame buffer to the Android device's native orientation.
読み終わるまでの所要時間 7 分最終更新 1ヶ月前
アプリケーションのフレームバッファの向きがデバイス本来のディスプレイの向き (ほとんどのデバイスでは縦向き) と一致しない場合、Android はフレームごとにアプリケーションのフレームバッファを回転させ、デバイスのディスプレイに一致させます。デバイスのハードウェア性能によっては、この追加の回転がパフォーマンスにネガティブな影響を及ぼす場合があります。アプリケーションが Vulkan Graphics API を使用し、デバイスが Vulkan をサポートしている場合、Unity はレンダリング中にこの回転を適用できるため、回転によるパフォーマンスへの影響が軽減されます。これは pre-rotation (事前回転) と呼ばれます。
Unity での事前回転の使用
Unity で事前回転を適用するには、C# スクリプトまたは Unity エディターを使用します。
-
C# スクリプトで以下を行います。まず PlayerSettings.vulkanEnablePreTransform をに設定します。
true -
Unity エディターを起動します。
-
-
Edit > Project Settings を選択します。
-
Project Settings (プロジェクト設定) ウィンドウで、Player タブを選択し、Android Player Settings (Android プレイヤー設定) を開きます。

-
Other Settings セクションで、Apply display rotation during rendering (レンダリング中にディスプレイの回転を適用する) を有効にします。
-
Unity による事前回転の適用の仕組み
Unity では、レンダーテクスチャにレンダリングするときではなく、デバイスのバックバッファに直接レンダリングするときに事前回転が適用されます。回転を適用するために射影行列が変更され、 および のビルトインシェーダー変数が影響を受けます。つまり、回転は頂点シェーダーで適用されます。
UNITY_MATRIX_MVPUNITY_MATRIX_P事前回転を使用しても、Unity の C# API の動作には影響しません。例えば、事前回転の後でも を使用して画面の幅にアクセスできます。また、ビューポートや scissor rect についても同様です。Unity はこれらを必要に応じて調整し、Grab Pass、ReadPixels、Screenshot などのバックバッファからのリードバック操作も処理します。
Screen.widthUnity では、シェーダーの特殊なケースに対応するためのユーティリティマクロを用意しています (詳細は、後述の制限セクションを参照してください)。
マクロ UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION は、以下の条件がすべて真である場合にのみ定義されます (そうでない場合は未定義です)。
- が Player Settings で有効になっていること。
preTransform - プラットフォームが Android に設定されていること。
- グラフィックス API が Vulkan に設定されていること。
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM は定数で、現在の 回転に設定されます。その値は以下のいずれかとなります。
preTransformUNITY_DISPLAY_ORIENTATION_PRETRANSFORM_0UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_90UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_180UNITY_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 開発者向けウェブサイトの Vulkan Design Guidelines (Vulkan 設計ガイドライン)。
- Arm コミュニティウェブサイトの Vulkan Mobile Best Practice - Appropriate Use of Surface Rotation (Vulkan Mobile のベストプラクティス - サーフェスの回転の適切な使用)。