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