, Metal, .
Melita, "" , . MDLVertexBufferLayout, :
, ( ) , .
.layouts .attributes MDLVertexDescriptor , ( , ), .
.layouts .attributes , , , ... ?

class func setup(meshWithDevice device: MTLDevice) -> MTKMesh
{
let allocator = MTKMeshBufferAllocator(device: device)
let vertexDescriptor = MDLVertexDescriptor()
let vertexLayout = MDLVertexBufferLayout()
vertexLayout.stride = MemoryLayout<Vertex>.size
vertexDescriptor.layouts = [vertexLayout]
vertexDescriptor.attributes =
[
MDLVertexAttribute(name: MDLVertexAttributePosition, format: MDLVertexFormat.float4, offset: 0, bufferIndex: 0),
MDLVertexAttribute(name: MDLVertexAttributeNormal, format: MDLVertexFormat.float4, offset: MemoryLayout<float4>.size, bufferIndex: 0)
]
var error : NSError? = nil
let asset = MDLAsset(url: Bundle.main.url(forResource: "teapot", withExtension: "obj")!, vertexDescriptor: vertexDescriptor, bufferAllocator: allocator, preserveTopology: true, error: &error)
if let error = error
{
print(error)
}
let teapotModel = asset.object(at: 0) as! MDLMesh
let teapot = try! MTKMesh(mesh: teapotModel, device: device)
return teapot
}
(Swift 3.0 XCode 8 Beta 6)
, .
:

Whelp, , :
//// Buffers
renderPass.setVertexBuffer(mesh.vertexBuffers[0].buffer, offset: 0, at: 0)
renderPass.setVertexBuffer(uniformBuffer, at: 1)
let submesh = mesh.submeshes[0]
let indexSize = submesh.indexType == .uInt32 ? 4 : 2
//// Draw Indices
renderPass.drawIndexedPrimitives(submesh.primitiveType,
indexCount: submesh.indexBuffer.length / indexSize,
indexType: submesh.indexType,
indexBuffer: submesh.indexBuffer.buffer,
indexBufferOffset: 0)
let indexSize = submesh.indexType == .uInt32 ? 4 : 2, 32 : 16 , .length , , .
, Obj Metal, : , , .