4

我目前正在使我的个人引擎适应 Vulkan,并且我想重新实现透明窗口,这在 OpenGL 中已经有了。

我认为我需要做的就是选择正确的颜色格式(带有 alpha 通道)并将compositeAlpha属性设置VkSwapchainCreateInfoKHRVK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR

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

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

是否有任何其他必要的更改来完成这项工作?

一些信息

图像格式和我在Sascha Willems 示例VK_FORMAT_B8G8R8A8_UNORM中找到的 vulkan 设置。

4

2 回答 2

6

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

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

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

由于它以前在 OGL 中对您有用,因此后者更有可能。但是玩平台窗口创建参数不会有什么坏处......

于 2016-07-09T16:02:04.217 回答
2

不知道这是否仍然相关,但我通过 GLFW 使用透明窗口。(如果您不使用 GLFW,您可能会忽略此答案!)

如此处所述,获得窗口透明度有两种方法:帧缓冲区透明度(alpha 位)和窗口透明度。

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

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

于 2021-04-05T13:53:20.357 回答