objective-c - 使用 Apple 的 Metal 的透明窗口和视图
问题描述
我想创建一个完全透明且可用于绘图的窗口(屏幕显示)。创建这样一个窗口实际上非常简单,只需将opaque
属性设置为false
并用清晰的颜色填充相应的视图。之后,CGImage
可以使用图形上下文绘制以更新视图,并且具有 alpha 通道的相应区域将是透明/半透明的。
我决定做同样的事情,但使用 Metal API,即我用 a 替换了我的视图MTKView
并使用纹理而不是CGImage
在窗口上绘制。我从Apple Documentation阅读了相应的章节,然后我选择了其中一个示例(“基本纹理”)并决定对其进行修改以测试它是否有效:
- 我通过
opaque
将窗口的属性设置为NO
. - 在函数的第一行中,我按以下方式
drawInMTKView
更改了:(如文档中的“设备和命令”教程所示)。clearColor
view.clearColor = MTLClearColorMake(0.0, 0.0, 0.0, 0.0);
- 然后我将加载图像的 alpha 通道值
AAPLImage.h
从dstImageData[dstPixelIndex + 3] = 255;
更改为dstImageData[dstPixelIndex + 3] = 125;
。
在所有这些更改之后,我希望我的视图是完全透明的(清晰的颜色是完全透明的颜色),并且带有 alpha 通道的纹理部分将具有相应的透明度级别。但是默认情况下视图是黑色的,我不能使部分视图(或整个视图)透明。
我可能会假设我必须向渲染管道添加一些额外的配置才能使其工作。但是,Metal 可能无法实现这样的事情,但我不确定。
此外,我尝试遵循Metal MTLTexture 的建议,当 alpha 值不是 1 或 0 时,用黑色替换半透明区域,但不幸的是它没有帮助。
解决方案
视图类上还有一个isOpaque
属性可能需要为 false。在 iOS ( UIView
) 中,您可以简单地设置它,但在 macOS ( NSView
) 中,您需要覆盖它以返回 false。
推荐阅读
- python - 为什么 Python 调试器不能在 VS Code 中工作?
- node.js - 端口 3000 总是被占用(即使我用 PORT=XYZ 覆盖它)
- python - 按下按钮时如何开始闪烁我的文本标签?
- generics - 元组上 std::ops 的通用实现
- ruby-on-rails - 是否有一种配置可以清除 i18n 插值字符串的缓存(或者可能阻止缓存)?
- node.js - 如何使用 mongodb 更新双嵌套数组中的对象?
- python - 我想知道下面代码中 lambda x=x 的目的是什么?
- r - 日期和其他列作为 R 闪亮中的过滤器
- android - FileSystemNotFoundException:未安装提供程序“gs”(Android)
- reactjs - 故障映射反应带模态