ARKit,用于 ARSCNView 的金属着色器

Posted

技术标签:

【中文标题】ARKit,用于 ARSCNView 的金属着色器【英文标题】:ARKit, metal shader for ARSCNView 【发布时间】:2018-04-21 15:42:25 【问题描述】:

试图弄清楚如何解决将着色器应用于我的 ARSCNView 的问题。 以前,当使用标准 SCNView 时,我已经能够通过以下方式成功应用失真着色器:

if let path = Bundle.main.path(forResource: "art.scnassets/distortion", ofType: "plist") 
    if let dict = NSDictionary(contentsOfFile: path)  
        let technique = SCNTechnique(dictionary: dict as! [String : AnyObject])

        scnView.technique = technique
    

用 ARSCNView 替换 SCNView 会出现以下错误:

“错误:Metal 渲染器不支持零顶点函数名”

“错误:_executeProgram - 无管道状态”

我在想这是因为 ARSCNView 使用了与 SCNView 不同的渲染器。但是记录 ARSCNView.renderingAPI 并没有告诉我有关渲染器的任何信息,而且当我构建我的 ARSCNView 实例时,我似乎无法选择一个。我一定遗漏了一些明显的东西,因为在网上搜索参考资料时我似乎找不到单一资源。

我最初的想法是使用 SCNProgram 来应用着色器。但我找不到任何关于如何将其应用于 ARSCNView 的资源,或者如果它甚至是正确/可能的解决方案,SCNProgram 似乎是为材料保留的。

谁能给我任何有用的指导,告诉我如何解决 ARSCNView 的顶点+片段着色器?

【问题讨论】:

【参考方案1】:

SCNTechnique for ARSCNView 不适用于 GLSL 着色器,而是需要在技术的 plist 文件中的键 metalVertexShadermetalFragmentShader 下提供金属函数。

相反,documentation 表示任何着色器组合都应该起作用:

您必须同时指定片段和顶点着色器,并且必须 指定一个 GLSL 着色器程序、一对 Metal 函数,或者 两个都。如果两者都被指定,SceneKit 使用任何一个着色器 适合当前的渲染器。

所以这可能是一个错误,但我猜文档已经过时了。由于所有运行 ARKit 的设备也运行 Metal,因此 ARSCNViews 中没有添加 GLSL 支持。 随着 ios12 弃用 OpenGL,这看起来像是计划好的。

【讨论】:

金属 SCNTechnique 着色器示例:github.com/lachlanhurst/SCNTechniqueTest/blob/master/…【参考方案2】:

我在 ARKit iOS11.4 和 12 中遇到了这个问题,它归结为一系列拼写错误的着色器。我希望这可能对某人有所帮助。

【讨论】:

以上是关于ARKit,用于 ARSCNView 的金属着色器的主要内容,如果未能解决你的问题,请参考以下文章

ARKit从入门到精通-ARScnView介绍

ARKit ARSCNView.snapshot() 内存泄漏

如何在 ARKit 中打印出着色器修改器输出?

带有 SceneKit SCNProgram 的金属着色器

在 Swift Playgrounds 中使用 SCNTechnique 和金属着色器

金属着色器 stage_in