Vulkan 和透明 windows
Vulkan and transparent windows
我目前正在调整我的个人引擎以适应 Vulkan,我想重新实现透明 windows,我已经使用 OpenGL 实现了。
我认为我需要做的就是 select 正确的颜色格式(带 alpha 通道)并将 VkSwapchainCreateInfoKHR
的 compositeAlpha
属性 设置为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*)
,以检查调用第一个方法是否成功。
我目前正在调整我的个人引擎以适应 Vulkan,我想重新实现透明 windows,我已经使用 OpenGL 实现了。
我认为我需要做的就是 select 正确的颜色格式(带 alpha 通道)并将 VkSwapchainCreateInfoKHR
的 compositeAlpha
属性 设置为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*)
,以检查调用第一个方法是否成功。