【发布时间】:2021-01-31 19:53:33
【问题描述】:
我正在使用CARenderer 将另一个CALayer 树渲染成CAMetalLayer,我希望将其用作另一层的mask。出于测试目的,我尝试将CAMetalLayer 添加为普通子图层而不是蒙版。
下面的layer 对象在添加到绝对可见的超层后不可见。我已经确认该层的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];
但是当我设置CAMetalLayer 的superlayer 时,它无处可见。
[self.layer addSublayer:layer];
这是我使用CARenderer的方式:
[_renderer beginFrameAtTime:CACurrentMediaTime() timeStamp:NULL];
[_renderer addUpdateRect:bounds];
[_renderer render];
[_renderer endFrame];
最后一个 sn-p 经常运行。
编辑 1
我添加了一个backgroundColor,现在layer 是可见的,但它的纹理没有在其中渲染。
layer.backgroundColor = NSColor.yellowColor.CGColor;
【问题讨论】:
-
您使用金属层而不是将层树本身设置为蒙版是否有原因?如果您在进行自定义金属绘图会更有意义,但是在 CA 之外进行往返似乎很奇怪。
-
@NoahWitherspoon 据我了解,
CALayer对象不会在 CPU 上生成位图,所以我想我可以通过使用 GPU 纹理进行屏蔽来减少 CPU 使用率(如果这可能的话) . -
我明白了。这是可能的,但我肯定会先尝试更简单的方法。在下面的答案中进行了详细说明。
标签: objective-c macos core-animation calayer metal