CARenderer 渲染的带有纹理的 CAMetalLayer 不可见?

CAMetalLayer with texture rendered by CARenderer is not visible?

我正在使用 CARenderer 将另一棵 CALayer 树渲染成 CAMetalLayer,我希望将其用作另一层的 mask。出于测试目的,我尝试将 CAMetalLayer 添加为普通子层而不是遮罩。

下面的layer对象添加到绝对可见的superlayer后不可见。我已经确认图层的 frame 没有问题。这是我制作 CAMetalLayer 及其 CARenderer.

的方法
CAMetalLayer *layer = [CAMetalLayer layer];
layer.frame = bounds;
layer.device = MTLCreateSystemDefaultDevice();
//layer.opaque = NO;
//layer.framebufferOnly = NO;

id<CAMetalDrawable> drawable = layer.nextDrawable;
_lastDrawable = drawable;

_renderer = [CARenderer rendererWithMTLTexture:drawable.texture options:nil];
_renderer.layer = self.superview.layer;
_renderer.bounds = bounds;

通过创建 CIImage 并使用调试器检查它,我确认 CARenderer 正在更新金属纹理。

CIImage *img = [CIImage imageWithMTLTexture:_lastDrawable.texture options:nil];

但是当我设置CAMetalLayersuperlayer时,就看不到了

[self.layer addSublayer:layer];

我是这样使用 CARenderer:

[_renderer beginFrameAtTime:CACurrentMediaTime() timeStamp:NULL];
[_renderer addUpdateRect:bounds];
[_renderer render];
[_renderer endFrame];    

最后一个片段经常运行。


编辑 1

我添加了一个 backgroundColor,现在 layer 是可见的,但它的纹理没有在其中渲染。

layer.backgroundColor = NSColor.yellowColor.CGColor;

我建议只将原始图层设置为蒙版,而不是先尝试将其渲染为纹理;你有点在重复 CA 无论如何都会做的工作。

如果您真的需要控制渲染遮罩层树的时间——同样,您绝对应该首先尝试标准方法——正确的方法是创建一个 IOSurface-backed MTLTexture 而不是使用一个CAMetalLayer 的可绘制对象,使用 CARenderer 绘制到纹理中,将 IOSurface 设置为常规 CALayer 的内容,并将该层用作蒙版。