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 中的金属生成网格的主要内容,如果未能解决你的问题,请参考以下文章