0

I want to create a 3D scene with the SceneKit modeler and then read it into my Metal app. I see there is SceneKit and ModelIO API to do this but I am unclear on how the pieces fit together.

So, what I need is path from .scn file -> MDL Mesh -> geometry + texture. I am unclear on how I would sync my Metal shaders with materials created in the SceneKit modeler.

4

1 回答 1

6

您在这里要问的内容有两个主要部分:将 SceneKit 数据导入 ModelIO,以及使用 Metal 渲染 ModelIO 数据。

  1. 要将 SceneKit 场景导入 ModelIO,首先使用 SceneKit API(SCNSceneSCNSceneSource加载.scn文件,然后使用 ModelIO API 获取您想要的网格物体。您可以使用MDLAsset从整个场景创建一个assetWithSCNScene:bufferAllocator:,然后在 ModelIO 中遍历资产的对象层次结构找到您想要的网格,或者遍历 SceneKit 中的节点层次结构以找到您想要的SCNNodeorSCNGeometry然后使用objectWithSCNNode:bufferAllocator:or将网格传递给 ModelIO meshWithSCNGeometry:bufferAllocator:

  2. 至于在 Metal 应用程序中使用 ModelIO 网格,Apple 有一个示例代码项目,展示了如何使用 ModelIO 加载 OBJ 网格,使用 MetalKit 将网格数据获取到 Metal GPU 缓冲区,以及连接从 ModelIO 获得的材质信息着色器变量以在您自己的渲染器中使用。

您应该能够将这两者放在一起:示例代码加载 OBJ 以获取MDLAssetor MDLMesh,使用 (1) 中的方法从 SceneKit 文件中获取资源或网格。

SceneKit 材质模型当然比示例代码中使用的简单 Phong 着色器复杂得多。但是示例代码确实显示了如何遍历 aMDLMaterial的属性并在 Metal 着色器中设置相应的参数——如果您创建更复杂的着色器,只需按照相同的步骤将材质属性映射到着色器的输入。

于 2016-11-03T19:24:05.990 回答