Version: 2022.1
言語: 日本語
Single-pass stereo rendering for Android
Testing and debugging

Framebuffer orientation

If your application’s framebuffer orientation doesn’t match the device’s native display orientation (portrait, for most devices), Android rotates the application’s framebuffer to match the device’s display every frame. Depending on the device’s hardware capabilities, this additional rotation can negatively affect performance. If your application uses the Vulkan Graphics API and the device supports Vulkan, Unity can apply this rotation during rendering which reduces the performance impact of the rotation. This is called pre-rotation.

Using pre-rotation in Unity

To make Unity apply pre-rotation, you can use C# scripts or the Unity editor:

How Unity applies pre-rotation

Unity applies pre-rotation when it renders directly to the device’s backbuffer, not when it renders to a Render Texture. To apply the rotation, Unity modifies the projection matrix which affects the UNITY_MATRIX_MVP and UNITY_MATRIX_P Built-in shader variables. This means that Unity applies the rotation in the vertex shader.

Using pre-rotation doesn’t affect the behavior of Unity’s C# API. For example, you can still use Screen.width to access the width of the screen. The same applies to viewports and scissor rects. Unity adjusts these as needed, and also handles readback operations from the backbuffer such as Grab Pass, ReadPixels, or Screenshot.

Unity provides utility macros to handle special cases in shaders (for more information, see the Limitations section below).

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

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

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 is translated into a Vulkan specialization constant, which makes it efficient to use in if or switch statements.

制限

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

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

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

参考資料

Single-pass stereo rendering for Android
Testing and debugging
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961