如何使用Metal渲染多个三角形条纹



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

但是,我真的不知道如何在金属中渲染多个三角形条纹

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(启用的。此功能在指定索引处完成当前基本体的绘制,并在下一个索引处开始绘制新的基本体。

可以通过定义由0xFFFF0xFFFFFFFF分隔的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

相关内容

  • 没有找到相关文章

最新更新