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.
To make Unity apply pre-rotation, you can use C# scriptsA piece of code that allows you to create your own Components, trigger game events, modify Component properties over time and respond to user input in any way you like. More info
See in Glossary or the Unity editor:
Through C# scripts: Set PlayerSettings.vulkanEnablePreTransform to true
.
Through the Unity Editor:
In the Project settings window, select the Player tab, then open Android Player Settings:
In the Other Settings section, enable Apply display rotation during rendering.
Unity applies pre-rotation when it renders directly to the device’s backbuffer, not when it renders to a Render TextureA special type of Texture that is created and updated at runtime. To use them, first create a new Render Texture and designate one of your Cameras to render into it. Then you can use the Render Texture in a Material just like a regular Texture. More info
See in Glossary. 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 shaderA program that runs on the GPU. More info
See in Glossary.
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 viewportsThe user’s visible area of an app on their screen.
See in Glossary 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).
The macro UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION is only defined if all of the following conditions are true (otherwise, it’s undefined):
preTransform
is enabled in the Player SettingsUNITY_DISPLAY_ORIENTATION_PRETRANSFORM is a constant that is set to the current preTransform
rotation. Its value is one of the following:
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_0
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_90
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_180
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_270
If UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION is undefined, or when rendering to a Render Texture, the value of UNITY_DISPLAY_ORIENTATION_PRETRANSFORM is 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.
In the following cases, it’s likely that enabling preTransform requires additional modifications to your Unity Project before you can use it:
SV_Position
)These cases only apply when rendering directly to the backbuffer.