通过尝试从网格中提取数据并将其“手动”填充到 Metal 缓冲区中,您实际上正在为自己做更多的工作。此外,anMTKMeshBuffer
不是 an MTLBuffer
— 它包含一个 Metal 缓冲区,以及您在使用该缓冲区进行渲染时可能需要的信息。
您实际上要做的是让 Model I/O为您分配 MetalKit 缓冲区,而不是自己做,这意味着 MetalKit 为数据分配 Metal 缓冲区,因此您不必复制它。然后使用 MetalKit 访问网格和缓冲区。像这样的东西(未经测试):
let allocator = MTKMeshBufferAllocator(device: myMetalDevice)
let mdlMesh = MDLMesh(scnGeometry: sceneGeometry, bufferAllocator: allocator)
let mtkMesh = try! MTKMesh(mesh: mdlMesh, device: myMetalDevice)
// ~~~~ <- in real code, please handle errors
// then, at render time...
for (index, vertexBuffer) in mtkMesh.vertexBuffers.enumerated() {
// vertexBuffer is a MTKMeshBuffer, containing an MTLBuffer
renderEncoder.setVertexBuffer(vertexBuffer.buffer,
offset: vertexBuffer.offset,
at: index)
}
for submesh in mtkMesh.submeshes {
// submesh is a MTKSubmesh, containing an MTKMeshBuffer
renderEncoder.drawIndexedPrimitives(type: submesh.primitiveType,
indexCount: submesh.indexCount,
indexType: submesh.indexType,
indexBuffer: submesh.indexBuffer.buffer,
indexBufferOffset: submesh.indexBuffer.offset)
}