アプリケーションのフレームバッファの向きがデバイスの元からのディスプレイの向き (ほとんどのデバイスでは縦) と一致しない場合、Android はアプリケーションのフレームバッファをフレームごとに、デバイスのディスプレイに合わせて回転させます。デバイスのハードウェア機能によっては、この追加の回転がパフォーマンスに悪影響を及ぼすことがあります。アプリケーションが Vulkan Graphics API を使用し、デバイスが Vulkan をサポートする場合、Unity はレンダリング中にこの回転を適用し、回転によるパフォーマンスへの影響を軽減することができます。これは pre-rotation (事前回転) と呼ばれます。
Unityに事前回転を適用させるには、C# スクリプトまたは Unity エディータを使用します。
C# スクリプトによる方法: PlayerSettings.vulkanEnablePreTransform を true
に設定します。
Unityエディターによる方法:
Edit > Project Settings を選択します。
Project Settings ウィンドウで Player タブを選択し、Android の Player 設定 (下の画像) を開いてください。
Other Setting セクションで、Apply display rotation during rendering を有効にします。
Unity は、レンダリングテクスチャ にレンダリングするときではなく、デバイスのバックバッファに直接レンダリングするときに、事前回転を適用します。回転を適用するために、UNITY_MATRIX_MVP
と UNITY_MATRIX_P
ビルトインシェーダー変数 に影響する投影行列が変更されます。つまり、Unity は頂点シェーダーで回転を適用します。
事前回転を使用しても、Unity の C# API の動作には影響しません。例えば、画面の幅にアクセスするには、Screen.width
を使用できます。ビューポートや シザー矩形 も同様です。Unity は必要に応じてこれらを調整し、Grab Pass、ReadPixels、Screenshot などのバックバッファからのリードバック操作も処理します。
Unity では、シェーダーの特殊なケースに対応するためのユーティリティマクロを用意しています (詳細は、後述の 制限 のセクションを参照してください)。
マクロ UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION は、以下の条件がすべて真である場合にのみ定義されます (そうでない場合は未定義です)。
preTransform
が Player 設定で有効になっていること。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 プロジェクトに追加の修正が必要になる可能性があります。
SV_Position
)。これらのケースは、バックバッファに直接レンダリングする場合にのみ適用されます。