如何将 SceneKit .scn 文件加载/解析到我的 Metal 应用程序中?

dug*_*gla 0 scenekit modelio metal metalkit

我想用SceneKit建模器创建一个 3D 场景,然后将其读入我的Metal应用程序。我看到有SceneKitModelIOAPI来做到这一点,但我对如何组合在一起不清楚。

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

ric*_*ter 5

您在这里询问的主要有两个部分:将 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 着色器中设置相应的参数——如果您创建一个更复杂的着色器,只需按照相同的步骤将材质属性映射到您的着色器的任何输入。

  • 您需要`import SceneKit.ModelIO` 或`#import <SceneKit/ModelIO.h>` 来获取SCN/MDL 桥接位。 (2认同)