0

现在我已经知道如何在 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是一个Array元素Vertex。相邻的三个顶点显示要渲染的三角形。

但是,我真的不知道如何在 Metal 中渲染多个 triangleStrips。

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,我将得到一个triangleStrip。但是如何渲染多个 triangleStrips?我尝试使用for循环来制作多个顶点缓冲区并用于renderEncoder.drawPrimitives绘制每个三角形条。出于性能原因,这样做似乎不是一个好主意。

4

1 回答 1

0

参考Metal 中 drawIndexedPrimitives(type:indexCount:indexType:indexBuffer:indexBufferOffset:instanceCount:baseVertex:baseInstance:)的文档:

使用相对于 indexType(MTLIndexTypeUInt16 为 0xFFFF 或 MTLIndexTypeUInt32 为 0xFFFFFFFF)的最大无符号整数索引值启用基元重启功能。此功能在指定索引处完成当前图元的绘制,并开始绘制具有下一个索引的新图元。

您可以通过定义由或indexBuffer分隔来渲染多个三角形条。0xFFFF0xFFFFFFFF

例如。在顶点 [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
于 2022-01-23T06:49:57.083 回答