Vulkan 中如何确定曲面的大小?

How is the size of a surface determined in Vulkan?

我正在学习 Vulkan 教程,Window Surface 部分说在 Windows 上使用以下代码创建了一个 VkSurfaceKHR 对象:

VkWin32SurfaceCreateInfoKHR createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
createInfo.hwnd = glfwGetWin32Window(window);
createInfo.hinstance = GetModuleHandle(nullptr);

if (vkCreateWin32SurfaceKHR(instance, &createInfo, nullptr, &surface) != VK_SUCCESS) {
    throw std::runtime_error("failed to create window surface!");
}

但我们从未在 createInfo 对象中指定表面的范围。

但是调用 vkGetPhysicalDeviceSurfaceCapabilitiesKHR 函数 returns 一个 VkSurfaceCapabilitiesKHR 对象,它有一个 currentExtent 字段,根据 documentation

the current width and height of the surface, or the special value (0xFFFFFFFF, 0xFFFFFFFF) indicating that the surface size will be determined by the extent of a swapchain targeting the surface.

所以在 currentExtent 等于 (0xFFFFFFFF, 0xFFFFFFFF) 的特殊情况下,我们知道表面的大小是由针对表面的交换链决定的,但在所有其他情况下,表面似乎已经有一个来自其他地方的大小,我们应该将交换链的范围与该大小相匹配。

那么当表面的大小不由交换链决定时,它从何而来?

在 Windows 上,表面的初始范围等于您在创建 window 时设置的宽度和高度值(减去 window 边框、菜单等) .

vkGetPhysicalDeviceSurfaceCapabilitiesKHR 返回的范围值也会在用户调整 window 大小时(在 Windows 上)自动更新。

同样重要的是要注意,在不同的平台上,maxmincurrent 范围的行为不同。在 Windows 上,输出表面必须始终等于可绘制的 window 大小,因此它们都将相等。