Сетка в металле IOS
Я новичок в MTKMesh/MDLMesh любой онлайн ресурсный материал для создания Создание пользовательской сетки в 2D. У меня есть данные Vertex.
init(vertexBuffer: MDLMeshBuffer, vertexCount: Int, descriptor: MDLVertexDescriptor, submeshes: [MDLSubmesh])
Я надеюсь использовать эту функцию. Любое предложение по созданию MDLMeshBuffer,MDLVertexDescriptor, Submeshes
1 ответ
Решение
Предположим, у вас есть Vertex
структура с одним float2
член, представляющий должность. Вы можете начать с массива таких вершин ([Vertex]
) и массив 16-разрядных целых индексов без знака ([UInt16]
).
Тогда вы можете сделать что-то вроде этого:
let device = MTLCreateSystemDefaultDevice()!
let allocator = MTKMeshBufferAllocator(device: device)
let vertexBuffer = allocator.newBuffer(MemoryLayout<Vertex>.stride * vertices.count, type: .vertex)
let vertexMap = vertexBuffer.map()
vertexMap.bytes.assumingMemoryBound(to: Vertex.self).assign(from: vertices, count: vertices.count)
let indexBuffer = allocator.newBuffer(MemoryLayout<UInt16>.stride * indices.count, type: .index)
let indexMap = indexBuffer.map()
indexMap.bytes.assumingMemoryBound(to: UInt16.self).assign(from: indices, count: indices.count)
let submesh = MDLSubmesh(indexBuffer: indexBuffer,
indexCount: indices.count,
indexType: .uInt16,
geometryType: .triangles,
material: nil)
let vertexDescriptor = MDLVertexDescriptor()
vertexDescriptor.attributes[0] = MDLVertexAttribute(name: MDLVertexAttributePosition,
format: .float2,
offset: 0,
bufferIndex: 0)
let mdlMesh = MDLMesh(vertexBuffer: vertexBuffer,
vertexCount: vertices.count,
descriptor: vertexDescriptor,
submeshes: [submesh])
let mesh = try? MTKMesh(mesh: mdlMesh, device: device)
Если ваш тип вершины является более сложным, вы соответственно измените дескриптор вершины.