Vulkan和透明窗户

时间:2016-07-09 12:27:56

标签: vulkan

我目前正在将我的个人引擎改编为Vulkan,我想重新实现透明窗口,我已经使用OpenGL了。

我认为我需要做的就是选择正确的颜色格式(使用Alpha通道)并将compositeAlpha的{​​{1}}属性设置为VkSwapchainCreateInfoKHR

但是,使用完全透明的颜色清除窗口并不能提供预期的效果。它完全不透明。

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

是否还有其他必要的更改才能使其正常工作?

一些信息

图片格式为VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR,我定位了Sascha Willems examples中找到的vulkan设置。

2 个答案:

答案 0 :(得分:2)

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

vkGetPhysicalDeviceSurfaceCapabilitiesKHR pSurfaceCapabilities->supportedCompositeAlpha查询此特定功能。它是一个位域/标志集,因此可以支持多个模式或不支持。

我认为结果/功能支持可能会受到VkSurface的影响。也就是说,平台窗口是如何创建的。或者也许驱动程序制造商还没有实现它(尽管该功能可以支持)。

因为它之前在OGL中有效,后者更有可能。但是玩平台窗口创建参数不会有什么坏处......

答案 1 :(得分:2)

不知道这是否仍然相关,但我通过 GLFW 让它与透明窗口一起工作。 (如果您不使用 GLFW,您可以忽略此答案!)

here所述,有两种获取窗口透明度的方法:帧缓冲区透明度(alpha 位)和窗口透明度。

对于窗口透明度,调用 glfwSetWindowOpacicity(GLFWwindow*, float) 就足够了,其中不透明度值应在 (0, 1] 范围内。

注意:由于 GLFW 不支持同时使用两种透明度方法,我们仍然必须在 VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHRcompositeAlpha 字段中使用 VkSwapchainCreateInfoKHR对象。
并非所有系统都支持窗口透明度,因此 GLFW 为我们提供了一个函数 glfwGetWindowOpacity(GLFWwindow*),用于检查调用第一个方法是否成功。