Version: 2021.3
Single-pass stereo rendering for Android
Testing and debugging

Vulkan 交换链预旋转

如果应用程序的帧缓冲区方向与显示器的原生方向(对于大多数设备为纵向)不匹配,则每次渲染帧出现在屏幕上时,Android 都需要应用额外的旋转。这种额外的旋转可能会产生性能成本,具体取决于设备的硬件功能。

大多数情况下,可以在渲染期间应用此旋转,而开销很小。为此,请导航到 Android Player Settings(另请参阅: PlayerSettings.vulkanEnablePreTransform)并启用 Apply display rotation during rendering

注意:此旋转仅适用于 Unity 直接渲染到后备缓冲区时。它在渲染到渲染纹理时不起作用。

为了应用旋转,Unity 修改了投影矩阵(UNITY_MATRIX_MVP、UNITY_MATRIX_P)。这意味着旋转本身是在顶点着色器中应用的。

preTransform 设置不会影响 Unity 的 C# API 的行为。例如,Screen.width 的值不会因为 preTransform 设置而改变。这同样适用于视口和剪辑矩形。Unity 根据需要调整这些设置,还会处理来自后备缓冲区的回读操作,例如 Grab Pass、ReadPixels 或 Screenshot。

Unity 提供实用程序宏来处理着色器中的特殊情况(有关更多信息,请参阅下面的已知限制部分)。

仅当以下所有条件都为真时才定义宏 UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION(否则,未定义):

  • preTransform 在播放器设置中启用
  • 平台设置为 Android
  • 图形 API 设置为 Vulkan

UNITY_DISPLAY_ORIENTATION_PRETRANSFORM 是一个常量,设置为当前 preTransform 旋转。它的值是以下之一:

  • UNITY_DISPLAY_ORIENTATION_0
  • UNITY_DISPLAY_ORIENTATION_90
  • UNITY_DISPLAY_ORIENTATION_180
  • UNITY_DISPLAY_ORIENTATION_270

如果 UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION 未定义,或者当渲染到渲染纹理时,UNITY_DISPLAY_ORIENTATION_PRETRANSFORM 的值是 UNITY_DISPLAY_ORIENTATION_0。

UNITY_DISPLAY_ORIENTATION_PRETRANSFORM 被转换为 Vulkan 特化常量,这样它在 ifswitch 语句中的使用会很高效。

已知限制

在以下情况下,如果启用 preTransform,则 Unity 项目可能需要额外修改,然后才能使用:

  • 不使用 Unity 投影矩阵的着色器
  • 依赖于片元着色器中当前像素位置的着色器 (SV_Position)
  • 使用屏幕空间导数(ddx、ddy)的着色器
  • 使用 Vulkan 交换链图像的原生渲染插件可能需要修改
  • 在 MRT 设置中通过 Unity RenderPass API 同时使用后备缓冲区与其他渲染纹理

这些情况仅适用于直接渲染到后备缓冲区时。

阅读更多信息

Single-pass stereo rendering for Android
Testing and debugging