Version: Unity 6.0 (6000.0)
语言 : 中文
Android 单通道立体渲染
允许或拒绝使用 Vulkan API

帧缓冲区方向

如果应用程序的帧缓冲区方向与设备的原生显示方向(大多数设备为纵向)不匹配,Android 会旋转应用程序的帧缓冲区以匹配设备的每帧显示。这种额外的旋转可能会对性能造成负面影响,具体取决于设备的硬件功能。如果您的应用程序使用 Vulkan 图形 API 并且设备支持 Vulkan,Unity 可以在渲染期间应用此旋转,从而降低旋转对性能的影响。此过程称为预旋转

在 Unity 中使用预旋转

要使 Unity 应用预旋转,可以使用 C# 脚本或 Unity 编辑器:

Unity 如何应用预旋转

Unity 在直接渲染到设备的后备缓冲区时应用预旋转,而不是在渲染到渲染纹理时应用预旋转。为了应用旋转,Unity 会修改投影矩阵,从而影响 UNITY_MATRIX_MVPUNITY_MATRIX_P 内置着色器变量。这意味着 Unity 在顶点着色器中应用旋转。

使用预旋转不会影响 Unity 的 C# API 的行为。例如,您仍然可以使用 Screen.width 来访问屏幕宽度。这同样适用于视口和剪辑矩形。Unity 根据需要调整这些设置,还会处理来自后备缓冲区的回读操作,例如 Grab Pass、ReadPixels 或 Screenshot。

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

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

  • 播放器设置中启用了 preTransform
  • 平台设置为 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 被转换为 Vulkan 特化常量,这样它在 if 或 switch 语句中的使用会很高效。

限制

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

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

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

其他资源

Android 单通道立体渲染
允许或拒绝使用 Vulkan API