Alpha/透明度和 MTKView?

Alpha / Transparency & MTKView?

我有一个金属片段着色器,returns 一些带有 alpha 通道的透明颜色,我想在 MTKView 下显示一个 UIView,但我得到的只有背景结果是黑色和 "error noise".

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)

如果我更改清晰颜色,我可以在透明颜色下看到它,如果我跳过清晰颜色,我会看到 "error noise"。清晰的颜色 Alpha 通道真的有作用吗?

有谁知道如何使 MTKView 透明?

更新:

这里是让 MTKView 透明的神奇 属性:

self.isOpaque = false

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

首先你应该改变 window 的不透明。 然后你应该找到 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;
}