Unity3d:Vulkan 交换链预旋转
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
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 特化常量,这样它在 if
或 switch
语句中的使用会很高效。
已知限制
在以下情况下,如果启用 preTransform,则 Unity 项目可能需要额外修改,然后才能使用:
- 不使用 Unity 投影矩阵的着色器
- 依赖于片元着色器中当前像素位置的着色器 (
SV_Position
) - 使用屏幕空间导数(ddx、ddy)的着色器
- 使用 Vulkan 交换链图像的原生渲染插件可能需要修改
- 在 MRT 设置中通过 Unity RenderPass API 同时使用后备缓冲区与其他渲染纹理
这些情况仅适用于直接渲染到后备缓冲区时。
3D建模学习工作室整理翻译,转载请标明出处!