pygfx / rendercanvas

One canvas API, multiple backends
https://rendercanvas.readthedocs.io
BSD 2-Clause "Simplified" License
8 stars 0 forks source link

How to get a transparent Canvas? #29

Open panxinmiao opened 5 months ago

panxinmiao commented 5 months ago

I want to render some scenes to the desktop using a transparent window. This requires setting the alpha_mode to premultiplied in the CanvasContext.config() method.

I have added a flag in the wgpu glfw backend code with a line like this: glfw.window_hint(glfw.TRANSPARENT_FRAMEBUFFER, True).

However, the alpha_mode="premultiplied" setting in the CanvasContext.config() method still seems to be unavailable.

The capable_alpha_modes here are always ['opaque']. https://github.com/pygfx/wgpu-py/blob/0cdef1deb7033a15adb646d4b151d6d97cef954c/wgpu/backends/wgpu_native/_api.py#L449-L454

Am I missing something? How can we get a canvas that supports alpha_mode="premultiplied"?

almarklein commented 5 months ago

Interesting. I just tried with this:

import glfw
import wgpu
from wgpu.gui.glfw import WgpuCanvas

glfw.init()
glfw.window_hint(glfw.TRANSPARENT_FRAMEBUFFER, True)
canvas = WgpuCanvas()
c = canvas.get_context()
c.configure(
    device=wgpu.utils.get_default_device(),
    format=wgpu.TextureFormat.bgra8unorm_srgb, 
    alpha_mode=wgpu.CanvasAlphaMode.premultiplied,
)

I get this error:

ValueError: Given format 'premultiplied' is not in supported formats ['opaque', 'unpremultiplied']

Interestingly, it does support unpremultiplied? which is not in the CanvasAlphaMode enum.

I found https://github.com/gfx-rs/wgpu/issues/3486 which relates to this issue. Following some links to referred issues suggests that others have similar issue. E.g. Appears to be an issue with wgpu not correctly detecting surface capabilities. SurfaceCapabilities::alpha_modes only contains Opaque on my machine, Windows 10, nvidia gpu.

panxinmiao commented 5 months ago

Ah, it seems that many people are encountering the same issue. This looks like it might be a problem with wgpu or something upstream