现在我已经知道如何在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()
这里,vertices_triangles
是元素Vertex
的Array
。相邻的三个顶点显示要渲染的三角形。
但是,我真的不知道如何在金属中渲染多个三角形条纹
let vertexBuffer = device.makeBuffer(vertices_triangleStrips)
renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0)
renderEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: vertices_triangleStrips.count)
如果我将相邻顶点放在vertices_triangleStrips
中,并将renderEncoder.drawPrimitives.type
设置为.triangleStrip
,我将得到一个三角形条带但是如何渲染多个三角形条纹?我尝试使用for
循环制作多个顶点缓冲区,并使用renderEncoder.drawPrimitives
绘制每个三角形条带。出于性能原因,这样做似乎不是一个好主意。
参考Metal:中drawIndexedPrimitives(类型:indexCount:indexType:indexBuffer:indexBufferOffset:instanceCount:baseVertex:baseInstance:(的文档
基元重新启动功能是使用相对于indexType的最大无符号整数值(0xFFFF用于MTLIndexTypeUInt16,0xFFFFFFFF用于MTLIndex1TypeUInt32(启用的。此功能在指定索引处完成当前基本体的绘制,并在下一个索引处开始绘制新的基本体。
可以通过定义由0xFFFF
或0xFFFFFFFF
分隔的indexBuffer
来渲染多个三角形条纹。
例如。渲染顶点[0,1,2,3][4,5,6,7][8,9,10][11,12,13,14,15,16]处的三角形条纹
let indexBytes: [UInt32] = [0, 1, 2, 3, 0xFFFFFFFF, 4, 5, 6, 7, 0xFFFFFFFF, 8, 9, 10, 0xFFFFFFFF, 11, 12, 13, 14, 15, 16, 0xFFFFFFFF]
let vertexBuffer = device.makeBuffer(bytes: vertices_triangleStrips,
length: vertices_triangleStrips.count * MemoryLayout<MetalPosition2>.stride,
options: [])!
let indexBuffer = device.makeBuffer(bytes: indexBytes,
length: indexBytes.count * MemoryLayout<UInt32>.stride,
options: [])!
renderEncoder.setVertexBuffer(vertexBuffer,
offset: 0,
index: 0)
renderEncoder.drawIndexedPrimitives(type: .triangleStrip,
indexCount: indexBytes.count,
indexType: .uint32,
indexBuffer: indexBuffer,
indexBufferOffset: 0) // only one instance