Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在SceneKit中使用金属着色器_Swift_Shader_Scenekit_Metal_Ios9 - Fatal编程技术网

Swift 在SceneKit中使用金属着色器

Swift 在SceneKit中使用金属着色器,swift,shader,scenekit,metal,ios9,Swift,Shader,Scenekit,Metal,Ios9,我想使用金属着色器对场景中使用的材质应用卡通/单元着色。我试图实现的着色器是苹果自己的AAPLCelShader,可以在中找到。我对在SceneKit中实现着色器有点陌生,所以我可能做的每件事都是完全错误的 据我在文档中了解,从iOS 9和Xcode 7开始,可以使用金属或GL着色器修改场景基特渲染。文档表明,这与GL着色器的方式相同 我的方法是尝试获取.metal文件的路径,然后将其加载到字符串中,以[string:string]字典的形式在scnmataryshaderModifiers属性

我想使用
金属
着色器对场景中使用的材质应用卡通/单元着色。我试图实现的着色器是苹果自己的
AAPLCelShader
,可以在中找到。我对在
SceneKit
中实现着色器有点陌生,所以我可能做的每件事都是完全错误的

据我在文档中了解,从iOS 9和Xcode 7开始,可以使用
金属
或GL着色器修改
场景基特
渲染。文档表明,这与GL着色器的方式相同

我的方法是尝试获取
.metal
文件的路径,然后将其加载到字符串中,以[string:string]字典的形式在
scnmatary
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
文件加载的单个长方体几何体。文件加载工作正常,所以这不是问题

错误来自我尝试查找路径的第二行,它为我提供了“在展开可选值时找到nil”,这是强制展开时所期望的,不同的是,它尝试加载的文件肯定在包中,并且相同的代码适用于其他文件类型,只是不是金属的

我是不是走错了路?我不明白为什么它不能访问文件,除了我滥用金属文件的问题


是否有一种更简单或更好的方法来实现单元着色并最终在边缘上形成粗体轮廓?

AAPLCelShader.metal是一个完整的顶点//片段实现,而ShaderModifier不是这样的:源代码将注入到已经完整的着色器中

相反,您可以使用AAPLCelShader.metal中的顶点和片段函数来创建。与GLSL相比,Metal的优点在于,您可以使用,而不是源代码字符串,因为源代码字符串更易于使用,并导致在运行时之前编译函数,而GLSL不支持。(这仍然不如应有的好,Swift会将金属函数识别为正确类型、可重构、命名空间的闭包。)当然,尽管GLSL SCN程序将转换为金属,但对于兼容硬件,金属SCN程序不会转换为过时设备

至于从SceneKit映射到rastex的(错误命名的ColorInOut)成员:


…很遗憾,我还没有给你答案。

这是一些很好的信息,谢谢。这对我来说是一个全新的领域,这确实让我对这一切有所了解。
float4 position [[position]];
float shine;
float3 normal_cameraspace;
float3 eye_direction_cameraspace;
float3 light_direction_cameraspace;