如果我使用金属分配 MDLAsset,然后使用该资产初始化 SCNNode,是不是将 SCNGeometrySource 对象复制到非金属缓冲区?

Posted

技术标签:

【中文标题】如果我使用金属分配 MDLAsset,然后使用该资产初始化 SCNNode,是不是将 SCNGeometrySource 对象复制到非金属缓冲区?【英文标题】:If I allocate MDLAsset using metal, then inititialize an SCNNode using that asset, are the SCNGeometrySource objects copied to non-Metal buffers?如果我使用金属分配 MDLAsset,然后使用该资产初始化 SCNNode,是否将 SCNGeometrySource 对象复制到非金属缓冲区? 【发布时间】:2021-03-02 08:13:39 【问题描述】:

如果我像这样分配MDLAssetSCNNode

let device: MTLDevice = (sceneView?.device)!
let allocator = MTKMeshBufferAllocator(device: device)
let url = Bundle.main.url(forResource: name, withExtension: "obj")
let asset = MDLAsset(url: url! as URL, vertexDescriptor: nil, bufferAllocator: allocator)

guard let object = asset.object(at: 0) as? MDLMesh else 
      print("Failed to get mesh from obj asset")
      return nil


let node = SCNNode.init(mdlObject: object)
let geometrySources = node.geometry.sources

我的 geometrySource 对象是由 Metal 缓冲区支持的,还是进程已经结束并复制了 NSData 中的数据?

【问题讨论】:

【参考方案1】:

经过实验,确实是这样,除非您使用金属缓冲区显式初始化SCNGeometrySource,否则它将由不可变的NSData 缓冲区支持。即使在初始设置中使用MTLMeshBufferAllocatorobj 文件加载到MDLAsset 中也是如此。

【讨论】:

以上是关于如果我使用金属分配 MDLAsset,然后使用该资产初始化 SCNNode,是不是将 SCNGeometrySource 对象复制到非金属缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章

金属着色语言 - (控制台)输出?

与金属 swift 并行计算数组值的总和

Cadence画版图时改变全部金属层

SceneKit:已从 STL 导入的导出网格导致垃圾

金属Rust:原子操作

金属着色器纹理读取与示例