Alpha / 透明度和 MTKView?

10

我有一个 Metal 片段着色器,返回一些带 alpha 通道的透明颜色,我想在 MTKView 下面显示一个 UIView,但是我得到的唯一背景结果是黑色和“错误噪声”。

MTLRenderPipelineDescriptor:

pipelineStateDescriptor.isAlphaToCoverageEnabled = true
pipelineStateDescriptor.colorAttachments[0].pixelFormat = .bgra8Unorm
pipelineStateDescriptor.colorAttachments[0].isBlendingEnabled = true
pipelineStateDescriptor.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha
pipelineStateDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha

MTLRenderPassDescriptor:

renderPassDescriptor.colorAttachments[0].loadAction = .clear
renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColor(red: 0, green: 0, blue: 0, alpha: 0)

如果我更改清除颜色,我可以在透明颜色下看到它,但是如果我跳过清除颜色,我会看到“错误噪声”。清除颜色的alpha通道实际上有用吗?

有人知道如何使MTKView透明吗?

更新:

这是使MTKView透明的神奇属性:

self.isOpaque = false

你是否正在使用MTKView的子类,该子类覆盖了opaque属性并返回false? - Ken Thomases
isOpaque 属性完成了它!谢谢 - Heestand XYZ
2个回答

12
如果一个 UIView 可能具有透明内容或无法用不透明绘图填充自身,则应将其 opaque (isOpaque) 属性设置为 false,以便它能与其后面的任何东西正确地合成。由于 MTKViewUIView 的子类,因此也适用于它。

2

首先,您应该更改窗口的不透明度。 然后,您应该定位MTKView实例,并将其图层的不透明度修改为NO。这样就可以了。


- (void)viewWillAppear
{
    [_view.window setOpaque:NO];
    _view.window.backgroundColor = [NSColor clearColor];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    MTKView *view = (MTKView *)self.view;
    view.layer.opaque = NO;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接