【问题标题】:Vulkan and transparent windowsVulkan 和透明窗口
【发布时间】:2016-07-09 12:27:55
【问题描述】:

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

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

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

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

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

一些信息

图像格式为VK_FORMAT_B8G8R8A8_UNORM,我设置了Sascha Willems examples 中的vulkan 设置。

【问题讨论】:

  • vkGetPhysicalDeviceSurfaceCapabilitiesKHR返回的支持模式有哪些?
  • @krOoze 你是对的,不支持,我想知道这是否是驱动程序限制。
  • 我想我会回答的,所以可以结案了……

标签: vulkan


【解决方案1】:

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

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

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

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

【讨论】:

  • 顺便说一句,这种情况应该已被验证层捕获。确保启用它们并从中受益......
  • 验证层很好,但我不太确定如何使用 C# 启用它们。在不使用太多非托管代码的情况下,让 C# 在 vulkan 上运行已经足够了。 :-)
  • 和 C++ 一样吗?在创建实例时启用VK_LAYER_LUNARG_standard_validation 层并正确初始化VK_EXT_debug_report 扩展内容。让它工作是值得的 - 例如AIS 可以帮助您解决这个特定的问题。
【解决方案2】:

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

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

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

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

【讨论】:

  • 虽然我不使用,但我很感激发布这样一个老问题的答案!
  • 是的,我想——也许有人会在某个时候欣赏这一点。直到本周早些时候,我一直在寻找这个问题的答案。 :)
猜你喜欢
  • 1970-01-01
  • 2011-01-07
  • 2013-02-21
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多