Сетка в металле IOS

Я новичок в MTKMesh/MDLMesh и любых онлайн-ресурсах для создания пользовательской сетки в 2D. У меня есть данные вершины.

init(vertexBuffer: MDLMeshBuffer, vertexCount: Int,  descriptor: MDLVertexDescriptor, submeshes: [MDLSubmesh])

Я надеюсь использовать эту функцию. Любое предложение по созданию MDLMeshBuffer, MDLVertexDescriptor, Submesh


person Ruban4Axis    schedule 13.02.2019    source источник
comment
Рубан, есть много хороших туториалов! пример raywenderlich.com/5493-metal-rendering-pipeline-tutorial   -  person Fattie    schedule 13.02.2019
comment
вот целый сайт! metalkit.org/2016/08/30/the-model- i-o-framework.html   -  person Fattie    schedule 13.02.2019


Ответы (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)

Если ваш тип вершины более сложный, вы должны соответствующим образом настроить дескриптор вершины.

person warrenm    schedule 13.02.2019
comment
В состоянии конвейера, как мы можем дать дескриптор вершины. Потому что это MDLVertexDescriptor. Не могли бы вы дать представление о конфигурациях состояния конвейера и конфигурациях рисования? - person Ruban4Axis; 19.03.2019
comment
Вы можете использовать функцию MTKMetalVertexDescriptorFromModelIO для преобразования дескриптора вершины MDL в дескриптор вершины MTL. - person warrenm; 19.03.2019
comment
Я понимаю, откуда берутся данные [Vertex], но что представляют индексы ([UInt16])? - person dmarnel; 06.11.2019
comment
@dmarnel Попробуйте задать новый вопрос, если вы не знакомы с индексированным рисунком. - person warrenm; 06.11.2019