我如何 load/parse 一个 SceneKit .scn 文件到我的 Metal 应用程序中?

How do I load/parse a SceneKit .scn file into my Metal app?

我想用 SceneKit 建模器创建一个 3D 场景,然后将其读入我的 Metal 应用程序。我看到有 SceneKitModelIO API 可以做到这一点,但我不清楚这些部分是如何组合在一起的。

所以,我需要的是 .scn 文件的路径 -> MDL Mesh -> 几何图形 + 纹理。我不清楚如何将 Metal 着色器与 SceneKit 建模器中创建的材质同步。

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

  1. 要将SceneKit场景导入ModelIO,首先使用SceneKit API(SCNSceneSCNSceneSource加载.scn文件,然后使用ModelIO API 获取您想要的对象作为网格。您可以使用 assetWithSCNScene:bufferAllocator: and then walk through the asset's object hierarchy in ModelIO to find the mesh you want, or walk through the node hierarchy in SceneKit to find the SCNNode or SCNGeometry you want and then get the mesh to ModelIO using objectWithSCNNode:bufferAllocator: or meshWithSCNGeometry:bufferAllocator:.

  2. 从整个场景创建一个 MDLAsset
  3. 关于在 Metal 应用程序中使用 ModelIO 网格,Apple 有一个 sample code project 展示了如何使用 ModelIO 加载 OBJ 网格,使用 MetalKit 将网格数据导入 Metal GPU缓冲区,并将您从 ModelIO 获得的 material 信息连接到着色器变量,以便在您自己的渲染器中使用。

你应该可以把这两个放在一起:示例代码加载一个 OBJ 以获得 MDLAssetMDLMesh,使用 (1) 中的方法来获取资产或从 SceneKit 文件中提取网格。

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