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 文件中的键 metalVertexShader
和 metalFragmentShader
下提供金属函数。
相反,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.snapshot() 内存泄漏