首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将UIView内容呈现到MTLTexture中

将UIView内容呈现到MTLTexture中
EN

Stack Overflow用户
提问于 2020-05-11 15:06:25
回答 1查看 490关注 0票数 2

我有一个(动画的) UIView-Hierarchy,我想定期将UIView内容呈现到MTLTexture中以便进一步处理。

我尝试的是继承父UIView的子类,并

代码语言:javascript
复制
override public class var layerClass: Swift.AnyClass {
  return CAMetalLayer.self
}

但是来自nextDrawable()的纹理是黑色的,并且不显示视图内容。

你知道如何获取包含视图内容的MTLTexture吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-18 13:00:53

感谢Matthijs Hollemanns用一些代码给我指明了正确的方向,我想出了下面的UIView扩展,它在全屏幕分辨率的iPhone8plus上每帧大约12毫秒就能完成这项工作。

代码语言:javascript
复制
extension UIView {

   func takeTextureSnapshot(device: MTLDevice) -> MTLTexture? {
      let width = Int(bounds.width)
      let height = Int(bounds.height)

      if let context = CGContext(data: nil,
                                 width: width,
                                 height: height,
                                 bitsPerComponent: 8,
                                 bytesPerRow: 0,
                                 space: CGColorSpaceCreateDeviceRGB(),
                                 bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue),
        let data = context.data {

        layer.render(in: context)

        let desc = MTLTextureDescriptor.texture2DDescriptor(pixelFormat: .rgba8Unorm,
                                                            width: width,
                                                            height: height,
                                                            mipmapped: false)
        if let texture = device.makeTexture(descriptor: desc) {
          texture.replace(region: MTLRegionMake2D(0, 0, width, height),
                          mipmapLevel: 0,
                          withBytes: data,
                          bytesPerRow: context.bytesPerRow)
          return texture
        }
      }
      return nil
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61724043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档