2016-11-17 21 views
1

Мне нужно создать экземпляр MTKMeshBuffer из экземпляра MDLMeshBufferData. Ниже представлен фрагмент кода:Как вытащить данные из MDLMeshBufferData, чтобы заполнить MTKMeshBuffer?

let mdlm = MDLMesh(scnGeometry:sceneGeometry, bufferAllocator:nil) 

let mdlSubmesh:MDLSubmesh = mdlm.submeshes?[ 0 ] as! MDLSubmesh 

let mdlIndexBufferData:MDLMeshBufferData = mdlSubmesh.indexBuffer as! MDLMeshBufferData 

let d:Data = mdlIndexBufferData.data 

let mtlIndexBuffer:MTKMeshBuffer = device.makeBuffer(bytes: ???, length: ???, options:MTLResourceOptions.storageModeShared) as! MTKMeshBuffer 

The ??? это биты, которые мне нужно заполнить. Может ли кто-нибудь, пожалуйста, показать мне подходящий API для извлечения битов из буфера MDL для заполнения буфера MTK?

ответ

1

Решение строить MTLBuffers для каждого из VertexBuffer и indexBuffer и использовать их в цикле отрисовки. Работает отлично.

Посмотрите: https://github.com/turner/HelloMetal и запустите цель HelloSceneKit.

1

Вы на самом деле делаете больше работы для себя, пытаясь вытащить данные из сетки и наполнить их в металлические буферы «вручную». Кроме того, MTKMeshBuffer не является MTLBuffer - он содержит Металлический буфер, а также информацию, которая вам может понадобиться при использовании этого буфера для рендеринга.

Что вы на самом деле, что делать здесь есть модель ввода/вывода выделить MetalKit буферы для вас вместо того, чтобы делать это самостоятельно, что означает MetalKit выделяет Металлические буферы для данных, поэтому вам не придется копировать его. Затем используйте 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) 
} 
+0

Да, я успешно создаю сетки через методы фабрики MDLMesh - плоскость/куб/сфера/... Отлично работает. Мотивация по созданию буферов - indexBuffer и vertexBuffer с нуля связана с чтением в файле SCNScene - .scn - и извлечением из него ячеек. Ключевой API - MDLMesh (scnGeometry: sceneGeometry, bufferAllocator: MTKMeshBufferAllocator (device: device)) - сломан, и я буду подавать на него радарную ошибку. Попробуй сам. – dugla

 Смежные вопросы

  • Нет связанных вопросов^_^