ARKit,用于ARSCNView的金属着色器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARKit,用于ARSCNView的金属着色器相关的知识,希望对你有一定的参考价值。

试图弄清楚如何解决我的着色器应用到我的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会给我以下错误:

“错误:金属渲染器不支持nil顶点函数名称”

“错误:_executeProgram - 没有管道状态”

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

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

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

答案

Qazxswpoi的SCNTechnique不适用于GLSL着色器,而是需要在ARSCNViewmetalVertexShader键下的技术plist文件中提供Metal函数。

相反,metalFragmentShader说着色器的任何组合都应该起作用:

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

所以这可能是一个错误,但我想文档已经过时了。由于所有ARKit运行设备也运行Metal,因此尚未向ARSCNViews添加GLSL支持。由于ios12对OpenGL不赞成,这看起来像是计划好的。

另一答案

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

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

ARKit从入门到精通-ARScnView介绍

ARKit ARSCNView.snapshot() 内存泄漏

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

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

金属着色器中的线条更宽更平滑

带有 SceneKit SCNProgram 的金属着色器