3

嗨,我正在尝试在节点周围产生发光效果。我使用了 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]
}

调用它使用:

myNode.filters = addBloom() 

在此处输入图像描述

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

arSceneView.antialiasingMode = .none

非常感谢!

阿德里安

4

1 回答 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 的内容使用具有透明背景的图像,它就不起作用,尽管使用另一张图像就可以了。

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

于 2018-07-18T00:03:56.163 回答