SceneKit ARKit 发光效果

4

你好,我想在节点周围创建一个发光的效果。 我使用了SCNNode filters属性,并将其设置为CIFilter数组。

这种方法可以正常工作并渲染,但只有当节点后面没有其他节点时才能看到效果,我对此很困惑。我尝试过设置渲染顺序和readDepth选项,但都无法解决问题。我目前陷入困境,希望得到您的建议!

请参考屏幕截图和代码示例。

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

    return [bloomFilter]
}

使用以下方式调用:
myNode.filters = addBloom() 

在此输入图片描述

最后一点,我注意到如果要使用CIFilter和Metal协作,需要将antiAliasing设置为.none。

arSceneView.antialiasingMode = .none

非常感谢! Adrien
1个回答

4
您尝试将writesToDepthBuffer设置为false,以便对那些不应用滤镜的节点进行过滤吗? writesToDepthBuffer是指SceneKit渲染过程中使用深度缓冲区来确定相对于观察者的表面渲染顺序。该属性的默认值为YES,表示SceneKit保存每个渲染像素的深度信息供后续渲染通道使用。通常,在渲染半透明对象时禁用写入深度缓冲区,因为后续的渲染过程可能需要有关它们后面的不透明对象的深度信息。
这个示例似乎运行良好:
/// Generates An SCNPlane & A Red & Green SCNSphere
func generateNodes(){

    let planeNode = SCNNode(geometry: SCNPlane(width: 1, height: 0.5))
    planeNode.geometry?.firstMaterial?.diffuse.contents = UIColor.black
    planeNode.position = SCNVector3(0, 0, -1)

    let redSphereNode = SCNNode(geometry: SCNSphere(radius: 0.1))
    redSphereNode.geometry?.firstMaterial?.diffuse.contents = UIColor.red
    redSphereNode.position = SCNVector3(-0.3, 0, -1)
    redSphereNode.filters = addBloom()

    let greenSphereNode = SCNNode(geometry: SCNSphere(radius: 0.1))
    greenSphereNode.geometry?.firstMaterial?.diffuse.contents = UIColor.green
    greenSphereNode.position = SCNVector3(0.3, 0, -1)
    greenSphereNode.filters = addBloom()

    self.augmentedRealityView.scene.rootNode.addChildNode(planeNode)
    self.augmentedRealityView.scene.rootNode.addChildNode(redSphereNode)
    self.augmentedRealityView.scene.rootNode.addChildNode(greenSphereNode)
    planeNode.geometry?.firstMaterial?.writesToDepthBuffer = false

}


/// Creates An Array Of CIBloom Filters
///
/// - Returns: [CIFilter]?
func addBloom() -> [CIFilter]? {
    let bloomFilter = CIFilter(name:"CIBloom")!
    bloomFilter.setValue(10.0, forKey: "inputIntensity")
    bloomFilter.setValue(30.0, forKey: "inputRadius")

    return [bloomFilter]
}

需要注意的一件事是,我发现如果我在SCNPlane的内容中使用具有透明背景的图片,则它不起作用,但对于另一张图片则没有问题。

希望这能帮到您...


嗨,Josh,我想感谢你,因为那个完美地起作用了! 这个发光效果节点后面的每个节点也应该有一个更低的渲染顺序,这样才能完美运行。 再次感谢! - Adrien Yvon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接