我目前正在将我的个人引擎改编为Vulkan,我想重新实现透明窗口,我已经使用OpenGL了。
我认为我需要做的就是选择正确的颜色格式(使用Alpha通道)并将compositeAlpha
的{{1}}属性设置为VkSwapchainCreateInfoKHR
。
但是,使用完全透明的颜色清除窗口并不能提供预期的效果。它完全不透明。
当然我的窗口系统,自从我有OpenGL后没有改变,支持它,当我只是禁用渲染时我也无法点击窗口的假定位置,这告诉我它就在那里。
是否还有其他必要的更改才能使其正常工作?
图片格式为VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR
,我定位了Sascha Willems examples中找到的vulkan设置。
答案 0 :(得分:2)
在使用之前必须查询该功能(与大多数其他功能一样)是否支持。否则使用它无效。
vkGetPhysicalDeviceSurfaceCapabilitiesKHR
pSurfaceCapabilities->supportedCompositeAlpha
查询此特定功能。它是一个位域/标志集,因此可以支持多个模式或不支持。
我认为结果/功能支持可能会受到VkSurface的影响。也就是说,平台窗口是如何创建的。或者也许驱动程序制造商还没有实现它(尽管该功能可以支持)。
因为它之前在OGL中有效,后者更有可能。但是玩平台窗口创建参数不会有什么坏处......
答案 1 :(得分:2)
不知道这是否仍然相关,但我通过 GLFW 让它与透明窗口一起工作。 (如果您不使用 GLFW,您可以忽略此答案!)
如here所述,有两种获取窗口透明度的方法:帧缓冲区透明度(alpha 位)和窗口透明度。
对于窗口透明度,调用 glfwSetWindowOpacicity(GLFWwindow*, float)
就足够了,其中不透明度值应在 (0, 1] 范围内。
注意:由于 GLFW 不支持同时使用两种透明度方法,我们仍然必须在 VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR
的 compositeAlpha
字段中使用 VkSwapchainCreateInfoKHR
对象。
并非所有系统都支持窗口透明度,因此 GLFW 为我们提供了一个函数 glfwGetWindowOpacity(GLFWwindow*)
,用于检查调用第一个方法是否成功。