版本:Unity 6 (6000.0)
语言:英语
Android 的单通道立体渲染
允许或拒绝使用 Vulkan API

帧缓冲区方向

如果您的应用程序的帧缓冲区方向与设备的原生显示方向(大多数设备为纵向)不匹配,Android 会在每一帧旋转应用程序的帧缓冲区以匹配设备的显示方向。根据设备硬件功能,这种额外的旋转会对性能产生负面影响。如果您的应用程序使用 Vulkan 图形 API 且设备支持 Vulkan,Unity 可以在渲染过程中应用此旋转,从而减少旋转对性能的影响。这称为 预旋转

在 Unity 中使用预旋转

要让 Unity 应用预旋转,可以使用 C# 脚本一段代码,允许您创建自己的组件,触发游戏事件,随时间修改组件属性,并以您喜欢的任何方式响应用户输入。 更多信息
术语表 中查看
或 Unity 编辑器

Unity 如何应用预旋转

Unity 在直接渲染到设备的后备缓冲区时应用预旋转,而不是渲染到 渲染纹理一种在运行时创建和更新的特殊纹理类型。要使用它们,首先创建一个新的渲染纹理,并指定一个相机渲染到其中。然后,您可以在材质中使用渲染纹理,就像使用普通纹理一样。 更多信息
术语表 中查看
。要应用旋转,Unity 会修改投影矩阵,这会影响 UNITY_MATRIX_MVPUNITY_MATRIX_P 内置着色器变量。这意味着 Unity 在顶点 着色器在 GPU 上运行的程序。 更多信息
术语表 中查看
中应用旋转。

使用预旋转不会影响 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