Reputation: 675
I want to create a window which is fully transparent and which can be used for drawing (On-Screen-Display). It's actually quite simple to create such a window, the one has to set the opaque
property to false
and fill the corresponding view with a clear color. After that the CGImage
can be drawn using the graphical context to update the view and the corresponding regions with alpha channel will be transparent / semi-transparent.
I decided to make the same thing but using the Metal API, i.e. I replaced my view with a MTKView
and used textures instead of CGImage
to draw onto the window. I read the corresponding chapters from Apple Documentation, then I took one of the examples ("Basic Texturing") and decided to modify it in order to test if it would work:
opaque
property of the window to NO
.drawInMTKView
function I changed the clearColor
in the following way: view.clearColor = MTLClearColorMake(0.0, 0.0, 0.0, 0.0);
(as shown "Devices and Commands" tutorial from docs).AAPLImage.h
from dstImageData[dstPixelIndex + 3] = 255;
to dstImageData[dstPixelIndex + 3] = 125;
.After all these change, I would expect that my view is fully transparent (the clear color is a fully transparent color) and that the parts of the texture with the alpha channel would have the corresponding transparency level. However the view is black by default and I cannot make parts of the view (or the whole view) transparent.
I may assume that I have to add some additional configuration to the rendering pipeline in order to make it work. However it could be that such things are not possible with Metal, but I'm not sure about that.
Also I tried to follow the suggestions from Metal MTLTexture replaces semi-transparent areas with black when alpha values that aren't 1 or 0 , but unfortunately it did not help.
Upvotes: 2
Views: 714
Reputation: 16439
There is also an isOpaque
property on the view class that may need to be false. In iOS (UIView
), you can simply set it, but in macOS (NSView
) you need to override it to return false.
Upvotes: 2