如何消除 ARKit/SceneKit 中灰色阴影平面?

5

我已经实现了一种在ARKit和SceneKit场景中添加阴影平面的方法之一。它运作得相当不错,阴影看起来很好。

问题在于,大多数情况下,该平面还带有灰色调。换句话说,它并不完全透明。另一方面,有时灰色调会消失,但几秒钟后又会重新出现。我尝试调整了几乎所有我能想到的SCNNode和SCNMaterial属性,但到目前为止,似乎无法可靠地消除灰色。有人有解决这个问题的建议吗?

// Make a transparent shadow plane for the Ground.
let shadowPlane = SCNPlane(width: CGFloat(self.width * 2), height: CGFloat(self.depth * 2))
shadowPlane.cornerRadius = 2
let shadowPlaneNode = SCNNode(geometry: shadowPlane)
shadowPlaneNode.name = shadowPlaneNodeName
shadowPlaneNode.eulerAngles.x = -.pi / 2
shadowPlaneNode.castsShadow = false

let material = SCNMaterial()
material.isDoubleSided = false
material.lightingModel = .constant // .shadowOnly does not show any shadows on iOS
material.colorBufferWriteMask = [.alpha]
shadowPlane.materials = [material]

node.addChildNode(shadowPlaneNode)

enter image description here

1个回答

1
经过更多实验,我找到了一个看起来很有效的解决方案。将材质.lightingModel设置为.shadowOnly实际上可以正确地工作,而且没有任何灰色色调,但只有在将产生阴影的直接光源的.shadowModel设置为.forward而不是.deferred时才能正常工作。
此外,我发现.shadowOnly中似乎存在一个错误,如果场景中有任何.type == .omni或== .spot的光源,则会完全渲染黑色平面。
以下是对我有效的代码:
let shadowPlane = SCNPlane(width: CGFloat(self.width * 1.5), height: CGFloat(self.depth * 1.5))
let shadowPlaneNode = SCNNode(geometry: shadowPlane)
shadowPlaneNode.name = shadowPlaneNodeName
shadowPlaneNode.eulerAngles.x = -.pi / 2
shadowPlaneNode.castsShadow = false

let material = SCNMaterial()
material.isDoubleSided = false
material.lightingModel = .shadowOnly // Requires SCNLight shadowMode = .forward and no .omni or .spot lights in the scene or material rendered black

shadowPlane.materials = [material]

node.addChildNode(shadowPlaneNode)

Shadows working correctly Rendering bug if there is a .omni or .spot light in the scene


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