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