Now I have already known how to render multiple triangles in Metal:
let vertexBuffer = device.makeBuffer(vertices_triangles)
renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0)
renderEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: vertices_triangles.count)
renderEncoder.endEncoding()
commandBuffer.present(view.currentDrawable!)
commandBuffer.commit()
Here, vertices_triangles is an Array of element Vertex. The adjacent three vertices shows a triangle to render.
However, I don't really know how to render multiple triangleStrips in Metal.
let vertexBuffer = device.makeBuffer(vertices_triangleStrips)
renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0)
renderEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: vertices_triangleStrips.count)
If I put adjacent vertices in vertices_triangleStrips and set renderEncoder.drawPrimitives.type to .triangleStrip, I will get one triangleStrip. But how can I render multiple triangleStrips? I tried using for loop to make multiple vertexBuffers and use renderEncoder.drawPrimitives to draw each triangleStrip. It seems that it's not a good idea to do this for performance reasons.
Referring to documentation of drawIndexedPrimitives(type:indexCount:indexType:indexBuffer:indexBufferOffset:instanceCount:baseVertex:baseInstance:) in Metal:
You could render multiple triangleStrips by defining an
indexBufferseperated by0xFFFFor0xFFFFFFFF.eg. rendering triangleStrips at vertex [0,1,2,3] [4,5,6,7] [8,9,10] [11,12,13,14,15,16]