Vulkan 和透明 windows

Vulkan and transparent windows

我目前正在调整我的个人引擎以适应 Vulkan,我想重新实现透明 windows,我已经使用 OpenGL 实现了。

我认为我需要做的就是 select 正确的颜色格式(带 alpha 通道)并将 VkSwapchainCreateInfoKHRcompositeAlpha 属性 设置为VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR.

然而,用完全透明的颜色清除 window 并不能提供预期的结果。它完全不透明。

当然我的 window 系统支持它,自从我有 OpenGL 以来它没有改变,当我只是禁用渲染时我也无法在 [=32 的假定位置点击=],这告诉我它就在那里。

是否需要进行任何其他更改才能使这项工作正常进行?

一些信息

图像格式为 VK_FORMAT_B8G8R8A8_UNORM,我将 vulkan 设置定向为 Sascha Willems examples

该功能(与大多数其他功能一样)在使用前必须查询是否受支持。否则无效。

此特定功能被 vkGetPhysicalDeviceSurfaceCapabilitiesKHR 查询为 pSurfaceCapabilities->supportedCompositeAlpha。它是一个bitfield/flag-set,所以可以支持多个模式或none。

我认为 result/feature 支持可能受到 VkSurface 的影响。也就是说,平台 window 是如何创建的。或者也许驱动程序制造商根本没有实现它(尽管该功能是可支持的)。

因为它之前在 OGL 中对您有效,所以后者更有可能。但是使用平台 window 创建参数不会有什么坏处...

不知道这是否仍然相关,但我通过 GLFW 使其与透明 windows 一起使用。 (如果你没有使用 GLFW,你可以忽略这个答案!)

here 所述,有两种方法可以获得 window 透明度:帧缓冲区透明度(alpha 位)和 window 透明度。

对于 window 透明度,调用 glfwSetWindowOpacicity(GLFWwindow*, float) 就足够了,其中不透明度值应在 (0, 1).

范围内

NOTE:由于GLFW不支持同时使用两种透明方式,我们还是必须在compositeAlpha字段中使用VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR VkSwapchainCreateInfoKHR 对象。
Window 并非所有系统都支持透明度,这就是为什么 GLFW 为我们提供了一个函数 glfwGetWindowOpacity(GLFWwindow*),以检查调用第一个方法是否成功。