您是否尝试将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 的内容使用具有透明背景的图像,它就不起作用,尽管使用另一张图像就可以了。
希望它为您指明正确的方向...