【问题标题】:How is the size of a surface determined in Vulkan?Vulkan 中如何确定表面的大小?
【发布时间】:2020-04-24 11:33:24
【问题描述】:

我正在关注 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 函数会返回一个VkSurfaceCapabilitiesKHR 对象,该对象有一个currentExtent 字段,根据documentation

表面的当前宽度和高度,或表示表面大小将由针对表面的交换链的范围确定的特殊值(0xFFFFFFFF,0xFFFFFFFF)。

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

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

【问题讨论】:

    标签: windows graphics gpu vulkan


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-04-19
      • 2015-01-16
      • 2014-03-25
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多