我想使用SceneKit
建模器创建一个3D场景,然后将其读入我的Metal
应用。我看到有SceneKit
和ModelIO
API来执行此操作,但我不清楚这些部分是如何组合在一起的。
所以,我需要的是来自.scn
文件的路径 - > MDL Mesh
- >几何+纹理。我不清楚如何将Metal
着色器与SceneKit
建模器中创建的材质同步。
答案 0 :(得分:4)
您在这里要问的有两个主要部分:将SceneKit数据导入ModelIO,并使用Metal渲染ModelIO数据。
要将SceneKit场景导入ModelIO,首先使用SceneKit API(SCNScene
或SCNSceneSource
加载.scn
文件,然后使用ModelIO API获取所需的对象您可以使用assetWithSCNScene:bufferAllocator:
从整个场景创建MDLAsset
,然后遍历ModelIO中的资源对象层次结构以查找所需的网格,或者遍历SceneKit中的节点层次结构找到您想要的SCNNode
或SCNGeometry
,然后使用objectWithSCNNode:bufferAllocator:
或meshWithSCNGeometry:bufferAllocator:
将网格连接到ModelIO。
至于在Metal应用程序中使用ModelIO网格,Apple有一个sample code project,它显示了如何使用ModelIO加载OBJ网格,使用MetalKit将网格数据导入Metal GPU缓冲区,以及钩子您从ModelIO获取的材质信息到着色变量,以便在您自己的渲染器中使用。
您应该能够将这两者放在一起:示例代码加载OBJ以获取MDLAsset
或MDLMesh
,使用(1)中的方法获取资产或网格改为使用SceneKit文件。
SceneKit材质模型当然比示例代码中使用的简单Phong着色器复杂得多。但示例代码确实显示了如何遍历MDLMaterial
的属性并在Metal着色器中设置相应的参数 - 如果您创建更复杂的着色器,只需按照相同的步骤将材质属性映射到无论你的着色器输入是什么。