アプリケーションのフレームバッファの向きが、ディスプレイのネイティブな向き (ほとんどのデバイスでは縦向き) と一致しない場合、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 設定で有効になっていること。UNITY_DISPLAY_ORIENTATION_PRETRANSFORM は定数で、現在の preTransform
回転に設定されます。その値は以下のいずれかです。
UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION が未定義の場合、またはレンダーテクスチャにレンダリングする場合、UNITY_DISPLAY_ORIENTATION_PRETRANSFORM の値は UNITY_DISPLAY_ORIENTATION_0 です。
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM は、Vulkan の特殊化定数に変換されているので、if
や switch
文で使用すると効率的です。
以下のケースでは、preTransform を有効にするために、Unity プロジェクトに追加の修正が必要になる可能性があります。
SV_Position
)。これらのケースは、バックバッファに直接レンダリングする場合にのみ適用されます。