windows - Vulkan 中如何确定表面的大小?
问题描述
我正在关注 Vulkan Tutorial,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
根据文档的字段
表面的当前宽度和高度,或特殊值(0xFFFFFFFF,0xFFFFFFFF)指示表面大小将由针对表面的交换链的范围确定。
因此,在currentExtent
等于 (0xFFFFFFFF, 0xFFFFFFFF) 的特殊情况下,我们知道表面的大小由针对表面的交换链决定,但在所有其他情况下,表面似乎已经具有源自其他地方的大小,我们是期望将交换链的范围与该大小相匹配。
那么,当表面的大小不是由交换链决定时,它从何而来?
解决方案
在 Windows 上,表面的初始范围等于您在创建窗口时设置的宽度和高度值(减去窗口边框、菜单等)。
vkGetPhysicalDeviceSurfaceCapabilitiesKHR
当用户调整窗口大小时(在 Windows 上),返回的范围值也会自动更新。
还需要注意的是,在不同的平台上,max
、min
和current
extent 的行为不同。在 Windows 上,输出表面必须始终等于可绘制窗口的大小,因此它们都是相等的。
推荐阅读
- .net - Kubernetes Nginx 入口 404 - .NET 微服务
- unity3d - 在 Microsoft HoloLens 上查找网格中的固定点
- javascript - Disemvowel Trolls - Javascript
- loops - Ansible 字典查找
- algorithm - 当我运行我的程序来计算一个整数的教堂数字时,为什么会出现 #("halt") 错误?
- excel - 在 VBA 中引用没有固定地址的新列
- antlr4 - 优先与可选就足够了
- javascript - 反应 useEffect 挂钩引用不正确的值
- java - 程序的 Java 阶乘计算不能做 0,1,2 我该如何解决这个问题
- javascript - 在 React 中将 props 传递给 this.props.children