有没有办法让Metal向每个实例提供顶点?
我正在绘制贝塞尔曲线。为此,我想更改每条贝塞尔曲线的顶点数量
有什么办法吗?
答案 0 :(得分:2)
在Metal(或任何其他API AFAIK)中,无法更改每个实例的顶点数。
实例化的主要好处是允许您通过一次绘制调用来绘制同一网格的许多实例。这样可以降低CPU开销和命令缓冲区的大小。但是,这并不是通过一次绘制调用就可以绘制许多不同的网格。
您可以在Metal中使用一项新功能,该功能将在iOS 12和macOS 10.14中提供,以向indirect command buffer添加许多绘图调用(每个顶点具有不同数量的顶点)。执行此缓冲区仅需要一次调用,因此它具有与实例化相同的性能优势,但更加灵活。
如果您要定位较早的操作系统,则可以在Metal缓冲区中构建一系列 MTLDrawPrimitivesIndirectArguments ,并为每个缓冲区调用-[MTLRenderCommandEncoder drawPrimitives:indirectBuffer:indirectBufferOffset:]
。这样会为每个对象添加一个绘制调用,因此它不像实例化或间接命令缓冲区那么快,但是它允许您做一些有趣的事情(例如使用计算内核在GPU上构建绘制调用列表)