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