我想用一个Metal
着色器将卡通/单元着色应用于场景中使用的材质。我试图实现的着色器是苹果自己的AAPLCelShader
发现于金属着色器展示柜 https://developer.apple.com/library/ios/samplecode/MetalShaderShowcase/Introduction/Intro.html。我对实现着色器有点陌生SceneKit
所以我可能做的每件事都完全错误。
根据我在文档中的理解Metal
或者可以使用GL着色器来修改SceneKit
从 iOS 9 和 Xcode 7 开始渲染。文档表明这与 GL 着色器的方式相同。
我的方法是尝试获取路径.metal
文件,然后将其加载到要在中使用的字符串中SCNMaterial
shaderModifiers
属性以 [String: String] 字典的形式,就像使用 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
文件。文件加载工作正常,所以这不是问题。
该错误来自我尝试查找路径的第二行,它给了我“在展开可选值时发现零”,这是强制展开所预期的,除了它尝试加载的文件是最重要的事实之外。当然在捆绑包中,相同的代码可以很好地处理其他文件类型,只是不能.metal
ones.
我的处理方式完全错误吗?我不明白为什么它不会访问该文件,除了我滥用金属文件的问题。
是否有更简单或更好的方法来实现单元格阴影并最终在边缘上实现粗体轮廓?