SceneKit ARKit 发光效果

Adr*_*von 4 bloom glow cifilter scenekit arkit

您好,我正在尝试在节点周围产生发光效果。我使用了 SCNNode 过滤器属性并设置为 CIFilter 数组。

仅当节点后面没有我不理解的节点时,它才起作用并呈现。我尝试设置渲染顺序和 readDepth 选项,但没有成功。我现在真的很困惑,非常感谢您的意见!

请参阅屏幕截图以获取示例和代码示例。

func addBloom() -> [CIFilter]? {
    let bloomFilter = CIFilter(name:"CIBloom")!
    bloomFilter.setValue(10.0, forKey: "inputIntensity")
    bloomFilter.setValue(30.0, forKey: "inputRadius")

    return [bloomFilter]
}
Run Code Online (Sandbox Code Playgroud)

使用以下方式调用它:

myNode.filters = addBloom() 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

最后一点,我注意到 CIFilter 要与 Metal 一起使用,抗锯齿需要设置为 .none

arSceneView.antialiasingMode = .none
Run Code Online (Sandbox Code Playgroud)

多谢!

阿德里安

Bla*_*orz 5

您是否尝试过将writesToDepthBuffer那些未应用过滤器的节点设置为 false ?

\n\n

供您writesToDepthBuffer参考的信息是:

\n\n
\n

SceneKit\xe2\x80\x99s 渲染进程使用深度缓冲区来确定渲染表面相对于查看器的顺序。此属性的默认值为 YES,指定 SceneKit 保存每个渲染像素的深度信息,以供后续渲染通道使用。通常,在渲染半透明对象时禁用写入深度缓冲区,因为稍后渲染过程的各个阶段可能需要有关其后面的不透明对象的深度信息。

\n
\n\n

这个例子似乎运行良好:

\n\n
/// Generates An SCNPlane & A Red & Green SCNSphere\nfunc generateNodes(){\n\n    let planeNode = SCNNode(geometry: SCNPlane(width: 1, height: 0.5))\n    planeNode.geometry?.firstMaterial?.diffuse.contents = UIColor.black\n    planeNode.position = SCNVector3(0, 0, -1)\n\n    let redSphereNode = SCNNode(geometry: SCNSphere(radius: 0.1))\n    redSphereNode.geometry?.firstMaterial?.diffuse.contents = UIColor.red\n    redSphereNode.position = SCNVector3(-0.3, 0, -1)\n    redSphereNode.filters = addBloom()\n\n    let greenSphereNode = SCNNode(geometry: SCNSphere(radius: 0.1))\n    greenSphereNode.geometry?.firstMaterial?.diffuse.contents = UIColor.green\n    greenSphereNode.position = SCNVector3(0.3, 0, -1)\n    greenSphereNode.filters = addBloom()\n\n    self.augmentedRealityView.scene.rootNode.addChildNode(planeNode)\n    self.augmentedRealityView.scene.rootNode.addChildNode(redSphereNode)\n    self.augmentedRealityView.scene.rootNode.addChildNode(greenSphereNode)\n    planeNode.geometry?.firstMaterial?.writesToDepthBuffer = false\n\n}\n\n\n/// Creates An Array Of CIBloom Filters\n///\n/// - Returns: [CIFilter]?\nfunc addBloom() -> [CIFilter]? {\n    let bloomFilter = CIFilter(name:"CIBloom")!\n    bloomFilter.setValue(10.0, forKey: "inputIntensity")\n    bloomFilter.setValue(30.0, forKey: "inputRadius")\n\n    return [bloomFilter]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,需要注意的一件事是,我确实注意到,如果我使用具有透明背景的图像作为 SCNPlane 的内容,它就不起作用,尽管使用另一个图像就可以了。

\n\n

希望它能为您指明正确的方向......

\n