我想使用Metal
着色器在场景中应用卡通/背景渲染材料。我正在尝试实现的着色器是苹果自己的AAPLCelShader
,可以在MetalShaderShowcase中找到。由于我对在SceneKit
中实现着色器还不太熟悉,所以我可能做错了一切。
根据文档,自iOS 9和Xcode 7起,可以使用Metal
或GL着色器修改SceneKit
渲染。文档建议这样做的方式与GL着色器相同。
我的方法是尝试获取.metal
文件的路径,然后将其加载到字符串中以形成[String: String]字典的形式,以便在SCNMaterial
shaderModifiers
属性中使用,就像使用GL着色器一样(虽然我还没有完全搞清楚如何正确地实现它)。
我的代码如下:
var shaders = [String: String]()
let path = NSBundle.mainBundle().pathForResource("AAPLCelShader", ofType: "metal")!
do{
let celShader = try String(contentsOfFile: path, encoding: NSUTF8StringEncoding)
shaders[SCNShaderModifierEntryPointLightingModel] = celShader
}catch let error as NSError{
error.description
}
scene.rootNode.enumerateChildNodesUsingBlock({ (node, stop) -> Void in
node.geometry?.firstMaterial?.shaderModifiers = shaders
})
这是在一个测试场景上运行的,它包含一个单一的盒子几何体,该几何体从一个.scn文件中加载。文件加载正常工作,所以这不是问题。
错误来自第二行,我试图找到路径时,它给了我"found nil while unwrapping optional value",这是可以预料的强制解包错误,除了它正在尝试加载的文件肯定在程序包中,并且相同的代码对其他文件类型也能很好地工作,只有.metal文件不能加载。
我完全错了吗?我不明白为什么它无法访问该文件,除非是我误用了metal文件。
是否有更简单或更好的方法来实现单元格着色和最终边缘的粗略轮廓?