禁用重叠平面的闪烁

  • 本文关键字:闪烁 平面 重叠 scenekit
  • 更新时间 :
  • 英文 :


您知道,例如有两个处于相同位置的平面时,它们会以不同的颜色开始相互作斗争,因此有些零件是另一种质感,而另一些则是其他部分。

我认为Scenekit的RenderingOrder应该解决此问题,但我无法正常工作。我给了Planea 0用于RenderingOrder和PlaneB 1,但什么也没发生。

基本上,我想在同一位置有两架飞机,但我希望另一个飞机是"主导地位",以便将主导平面呈现,而不是另一个。

这通常称为Z-tighting,并且只要存在3D,就一直是3D的问题。

有两种基本的方法,也不是理想的方法来解决这一问题,因为我目前对您的情况有所了解:

1。删除您不想看到的平面,直到您需要它,可能是当相机围绕另一侧或其他条件发生变化时,您'LL需要添加所需的飞机,然后卸下另一个。

2。在" Z空间"中稍微分开,或者有意义地将它们推到如此略微分开的任何空间中。这可能是一个非常少量的,很小,以至于观众不可能认为飞机不在完全相同的空间中。

对于2022。幸运的是,解决方案现在很简单,调整深度缓冲区的使用。

for i in 0..<theRelevantNodes.count {
    let n = theRelevantNodes[i]
    n.geometry?.firstMaterial?.readsFromDepthBuffer = false
}

通常,您只想使用深度缓冲区信息禁用,幸运的是现在很容易。

.writesToDepthBuffer也可用。

确实 - 如果实际上需要 - 您可以明确设置每个项目的.renderingOrder。请注意,.renderingOrder是节点本身的属性,而不是材料的属性。

对深度缓冲区的完整讨论超出了质量检查的范围,但幸运的是,这两个布尔人只有四个可能性,因此请尝试所有四个!

请注意,如果您使用焦点效应,可能会受到影响。

如果相关,则Draw性能可能会以一种或另一种方式影响。

在代表垂直平面的重叠框时有类似的问题。

,如果您不使用透明节点,则可能对您有用(我确实如此,所以我的问题仍然存在,我将在解决时进行更新(:

使用包含所有飞机几何形状的扁平节点。您可以将所有节点的儿童flattenedClone()弄平。然后每次添加更多平面节点时都会变平,即:

class myClass {
    //Accumulate planes into this node
    var flattenedNode = SCNNode()
    func addPlaneNode(_ newPlane: SCNNode) {
        flattenedNode.removeFromParentNode()
        flattenedNode.addChildNode(newPlane)
        flattenedNode = flattenedNode.flattenedClone()
        rootNode.addChildNode(flattenedNode)
    }
}

最新更新