首页 > 解决方案 > 使用 Apple 的 Metal 的透明窗口和视图

问题描述

我想创建一个完全透明且可用于绘图的窗口(屏幕显示)。创建这样一个窗口实际上非常简单,只需将opaque属性设置为false并用清晰的颜色填充相应的视图。之后,CGImage可以使用图形上下文绘制以更新视图,并且具有 alpha 通道的相应区域将是透明/半透明的。

我决定做同样的事情,但使用 Metal API,即我用 a 替换了我的视图MTKView并使用纹理而不是CGImage在窗口上绘制。我从Apple Documentation阅读了相应的章节,然后我选择了其中一个示例(“基本纹理”)并决定对其进行修改以测试它是否有效:

  1. 我通过opaque将窗口的属性设置为NO.
  2. 在函数的第一行中,我按以下方式drawInMTKView更改了:(如文档中的“设备和命令”教程所示)。clearColorview.clearColor = MTLClearColorMake(0.0, 0.0, 0.0, 0.0);
  3. 然后我将加载图像的 alpha 通道值AAPLImage.hdstImageData[dstPixelIndex + 3] = 255;更改为dstImageData[dstPixelIndex + 3] = 125;

在所有这些更改之后,我希望我的视图是完全透明的(清晰的颜色是完全透明的颜色),并且带有 alpha 通道的纹理部分将具有相应的透明度级别。但是默认情况下视图是黑色的,我不能使部分视图(或整个视图)透明。

我可能会假设我必须向渲染管道添加一些额外的配置才能使其工作。但是,Metal 可能无法实现这样的事情,但我不确定。

此外,我尝试遵循Metal MTLTexture 的建议,当 alpha 值不是 1 或 0 时,用黑色替换半透明区域,但不幸的是它没有帮助。

标签: objective-cswiftmacosmetalmetalkit

解决方案


视图类上还有一个isOpaque属性可能需要为 false。在 iOS ( UIView) 中,您可以简单地设置它,但在 macOS ( NSView) 中,您需要覆盖它以返回 false。


推荐阅读