如何在ARKit中使用SCNNode过滤器?

问题描述:

我想实现一个自定义的CIFilter与我的ARSCNView中的SCNNode一起使用。不幸的是,它只是创建一个灰色的矩形,节点应该在屏幕上。我也试过内置的CIFilter来检查我的代码无济于事。如何在ARKit中使用SCNNode过滤器?

在其他一些SO帖子中,我已经读过CIFilter只有在选择OpenGL作为SCNView的渲染API时才起作用,因为CoreImage与Metal没有很好地发挥作用,并且据我所知,不可能让ARSCNView运行与OpenGL。该帖子是从2016年开始的,所以我想知道是否有任何改变。

我想要实现的是概述/突出显示屏幕上的对象,以反馈用户关于对象选择。我已经通过添加着色器修改器实现了一些可用的功能,但它对阴影进行了有限的控制。我真的不想超过我自己的所有阴影。

下面是我的CIKernel的概述,它在Quartz Composer上非常出色。

任何帮助和信息是高度赞赏。

kernel vec4 outline(sampler src) { 
    vec2 texturePos = destCoord(); 
    float alpha = 4.0f * sample(src, texturePos).a; 
    float thickness = 5.0f; 

    alpha -= sample(src, texturePos + vec2(thickness, 0.0f)).a; 
    alpha -= sample(src, texturePos + vec2(-thickness, 0.0f)).a; 
    alpha -= sample(src, texturePos + vec2(0.0f, thickness)).a; 
    alpha -= sample(src, texturePos + vec2(0.0f, -thickness)).a; 

    if (alpha > 0.9f) { 
     vec4 resultCol = vec4(1.0f, 1.0f, 1.0f, alpha); 
     return resultCol; 
    }else{ 
     vec4 resultCol = sample(src, texturePos); 
     return resultCol; 
    } 
} 

我也遇到过类似的问题。原因是因为我们进行了以下设置。可以通过删除此设置来实现CIFilter。 我还没有分析的细节,但如果它来帮助!

sceneView.antialiasingMode = .multisampling4X 
sceneView.contentScaleFactor = 1.3