跳到主要内容

窗口系统(WSI)

由于可以在没有显示内容的情况下使用 Vulkan API,因此 WSI 是通过Vulkan 扩展的形式来提供的。大多数设备厂商支持 WSI。WSI 的设计初衷是为了从Vulkan核心API 中抽象出各平台的窗口机制。

wsi_setup

Surface

VkSurfaceKHR对象是平台不相关的,这种设计使 Vulkan API 可以将其用于所有的 WSI 操作,它通过VK_KHR_surface扩展来启用。

支持 Vulkan Surface 的各平台都有特定的 API 来创建VkSurfaceKHR

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

交换链

VkSwapchainKHR使用VkImage数组将渲染结果呈现到surface。交换链的各种呈现模式决定了如何呈现渲染结果。

wsi_engine

Khronos的示例教程阐述了在创建交换链和选择呈现模式时的各注意事项。

预旋转

移动设备是可以旋转的,因此应用程序窗口的方向和屏幕方向可能不匹配。应用程序需要支持两种模式:portrait(竖向)和landscape(横向),这两种模式的差异可以简化为分辨率的变化。然而某些显示系统使用屏幕的物理方向,设备旋转时,应用程序的输出也必须旋转才能显示正确的画面。

为了让应用程序在移动平台(如 Android)上充分利用 Vulkan,必须实现预旋转。Google 有一篇博客文章介绍了如何在交换链创建时指定方向来处理surface旋转,以及对应示例Vulkan-Samples中的一个示例也详细说明了为什么预旋转,它提供了一种在着色器中解决该问题的方法。如果使用 Adreno GPU 驱动的设备,Qualcomm 建议使用 VK_QCOM_render_pass_transform 扩展来实现预旋转。