【发布时间】:2015-09-05 15:39:33
【问题描述】:
我想使用Metal 着色器为场景中使用的材质应用卡通/单元格着色。我正在尝试实现的着色器是 Apple 自己的 AAPLCelShader,在 MetalShaderShowcase 中找到。我对在 SceneKit 中实现着色器有点陌生,所以我可能做的一切都完全错误。
据我在文档中了解,Metal 或 GL 着色器可用于修改 iOS 9 和 Xcode 7 中的 SceneKit 渲染。文档表明这与 GL 着色器的完成方式相同。
我的方法是尝试获取.metal文件的路径,然后将其加载到一个字符串中,以[String:String]字典的形式在SCNMaterialshaderModifiers属性中使用,如你会使用 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 文件加载的盒子几何体。文件加载工作正常,所以这不是问题。
错误来自我尝试查找路径的第二行,它给了我“在展开可选值时找到 nil”,这是强制展开时所预期的,除了它正在尝试的文件的事实load 肯定在捆绑包中,并且相同的代码适用于其他文件类型,但不是 .metal 的。
我是不是完全走错了路?除了我滥用金属文件的问题之外,我不明白为什么它不会访问该文件。
是否有更简单或更好的方法来实现单元格着色并最终在边缘上加粗轮廓?
【问题讨论】:
标签: swift shader scenekit metal ios9