窗口系统集成 (WSI)

由于 Vulkan API 可以在不显示结果的情况下使用,因此 WSI 通过使用可选的 Vulkan 扩展提供。大多数实现都将包含 WSI 支持。WSI 设计旨在将每个平台的窗口机制从核心 Vulkan API 中抽象出来。

wsi_setup

表面

VkSurfaceKHR 对象是与平台无关的,并且设计为 Vulkan API 的其余部分可以将其用于所有 WSI 操作。它使用 VK_KHR_surface 扩展启用。

每个支持 Vulkan Surface 的平台都有其自己的方法来从其各自的平台特定 API 创建 VkSurfaceKHR 对象。

创建 VkSurfaceKHR 后,可以查询各种功能格式呈现模式

交换链

VkSwapchainKHR 对象提供了通过 VkImage 对象数组将渲染结果呈现到表面的能力。交换链的各种呈现模式决定了呈现引擎的实现方式。

wsi_engine

Khronos 的示例和教程解释了在创建交换链和选择呈现模式时需要考虑的不同因素。

预旋转

移动设备可以旋转,因此应用程序窗口的逻辑方向和显示器的物理方向可能不匹配。应用程序需要在两种模式下运行:纵向横向。这两种模式之间的差异可以简化为仅分辨率的变化。但是,某些显示子系统始终在显示面板的“原生”(或“物理”)方向上工作。由于设备已旋转,要实现所需的效果,应用程序输出也必须旋转。

为了使您的应用程序在移动平台(如 Android)上充分利用 Vulkan,必须实现预旋转。Google 的一篇详细的博客文章介绍了如何在创建交换链期间通过指定方向来处理表面旋转,并附带独立示例Vulkan-Samples 还对为什么预旋转是一个问题进行了精彩的阐述,以及运行示例,展示了在着色器中解决该问题的方法。如果使用 Adreno GPU 供电的设备,Qualcomm 建议使用VK_QCOM_render_pass_transform扩展来实现预旋转。