如果应用程序的帧缓冲区方向与设备的原生显示方向(大多数设备为纵向)不匹配,Android 会旋转应用程序的帧缓冲区以匹配设备的每帧显示。这种额外的旋转可能会对性能造成负面影响,具体取决于设备的硬件功能。如果您的应用程序使用 Vulkan 图形 API 并且设备支持 Vulkan,Unity 可以在渲染期间应用此旋转,从而降低旋转对性能的影响。此过程称为预旋转。
要使 Unity 应用预旋转,可以使用 C# 脚本或 Unity 编辑器:
通过 C# 脚本操作:将 PlayerSettings.vulkanEnablePreTransform 设置为 true。
通过 Unity 编辑器操作:
在项目设置窗口中选择播放器 (Player) 选项卡,然后打开 Android 播放器设置 (Android Player Settings):
在其他设置 (Other Settings) 部分中,启用渲染期间应用显示旋转 (Apply display rotation during rendering)。
Unity 在直接渲染到设备的后备缓冲区时应用预旋转,而不是在渲染到渲染纹理时应用预旋转。为了应用旋转,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
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM 是一个常量,设置为当前 preTransform 旋转。它的值是以下之一:
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_0UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_90UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_180UNITY_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)这些情况仅适用于直接渲染到后备缓冲区时。