簡體   English   中英

金屬IOS中的網格

[英]Mesh in Metal IOS

我不熟悉MTKMesh / MDLMesh任何在線資源材料,無法創建2D創建自定義網格。 我有頂點數據。

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

我希望使用此功能。 關於創建MDLMeshBuffer,MDLVertexDescriptor,子網格的任何建議

假設您有一個Vertex結構,其中只有一個float2成員表示位置。 您可以從此類頂點的數組( [Vertex] )和16位無符號整數索引( [UInt16] )的數組[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)

如果您的頂點類型更復雜,則可以相應地調整頂點描述符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM