SceneKit 中的金属生成网格

Posted

技术标签:

【中文标题】SceneKit 中的金属生成网格【英文标题】:Metal-generated mesh in SceneKit 【发布时间】:2018-02-16 18:34:49 【问题描述】:

我正在使用 Metal 计算内核来生成网格数据(目前是三角形汤)。

是否可以有效地(无需任何复制)将网格数据导入 SceneKit 以利用 SceneKit 的渲染器?网格数据会经常更新,因此避免数据复制非常重要。三角形的数量也可能在每一帧中发生变化。

【问题讨论】:

【参考方案1】:

您可以将 MTLBuffer 传递给 SCNGeometrySource(无副本):

+ (instancetype)geometrySourceWithBuffer:(id <MTLBuffer>)mtlBuffer vertexFormat:(MTLVertexFormat)vertexFormat semantic:(SCNGeometrySourceSemantic)semantic vertexCount:(NSInteger)vertexCount dataOffset:(NSInteger)offset dataStride:(NSInteger)stride API_AVAILABLE(macos(10.11), ios(9.0));

并且你可以在 SCNGeometryElement 上动态调整元素的数量(实际上你只能裁剪,所以你必须预先分配一个足够大的缓冲区):

@property(nonatomic) NSRange primitiveRange API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0));

【讨论】:

这行得通,但必须等待计算完成才能设置primitiveRange 是很糟糕的。有没有办法让 SceneKit 使用MTLRenderCommandEncoder 的间接绘图?见developer.apple.com/documentation/metal/mtlrendercommandencoder/…

以上是关于SceneKit 中的金属生成网格的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SceneKit 中显示金属和透明纹理?

带有 SceneKit SCNProgram 的金属着色器

如何从代码在 SceneKit 中设置基于物理的渲染?

SceneKit 帧速率不一致

iOS 14 解决方法中的 SceneKit Metal 着色器编译性能错误

SceneKit - 在着色器修改器中访问目标颜色以进行混合