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