我正在关注 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是
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 上,表面的初始范围等于您在创建窗口时设置的宽度和高度值(减去窗口边框、菜单等)。
vkGetPhysicalDeviceSurfaceCapabilitiesKHR
返回的范围值也会在用户调整窗口大小时(在 Windows 上)自动更新。
同样重要的是要注意,在不同的平台上,max
、min
和 current
范围的行为不同。在 Windows 上,输出表面必须始终等于可绘制窗口的大小,因此它们都是相等的。
关于windows - Vulkan 中如何确定曲面的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59620313/