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];
但是当我设置CAMetalLayer
的superlayer
时,就看不到了
[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 的内容,并将该层用作蒙版。
我正在使用 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];
但是当我设置CAMetalLayer
的superlayer
时,就看不到了
[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 的内容,并将该层用作蒙版。