SceneKit剔除飞机

时间:2017-07-12 08:47:18

标签: ios swift graphics scenekit

我在SCNView中有一个SCNScene渲染。我有一些在场景中渲染/移动的* .dae模型。

我有一个透明的立方体,当我的一个模型落后于它时,我希望模型不会被渲染,因为此刻,由于立方体是透明的,你可以通过立方体看到它。

是否有任何属性/设置/着色器可以应用于透明立方体,以便其后面的任何内容都不会呈现?

示例:

我的眼睛是绿点,立方体是蓝色方块,我的模型是红色圆圈,然而被立方体隐藏的圆圈部分是紫色......这实际上是不可见的。蓝色方块也是看不见的。

Cull

这位开发人员有一个遮挡着色器可以满足我的需要,但它的Unity:https://youtu.be/MK3D91kCKzM

亲切的问候

克里斯

2 个答案:

答案 0 :(得分:15)

这是一个解决方案

  1. 对于多维数据集,请使用constant作为其lightingModel的素材。它是最便宜的。
  2. 此材料的writesToDepthBuffer设置为truecolorBufferWriteMask设置为[](空选项集)。这样,立方体将在深度缓冲区中写入,但不会在屏幕上绘制任何内容。
  3. 将多维数据集renderingOrder设置为-1,以便在场景中的任何其他节点之前绘制它。这将使多维数据集在任何其他对象之前写入深度缓冲区,从而防止它们在多维数据集后面被绘制。

答案 1 :(得分:0)

基于@mnuages answer,您可以使用此类:

import SceneKit

class OccludingNode : SCNNode {
    convenience init(geometry: SCNGeometry) {
        geometry.materials = [OccludingMaterial()]

        self.init()
        self.geometry = geometry
        self.renderingOrder = -1
    }
}

class OccludingMaterial : SCNMaterial {
    override init() {
        super.init()
        isDoubleSided = true
        lightingModel = .constant
        writesToDepthBuffer = true
        colorBufferWriteMask = []
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

根据您想要的任何几何图形创建一个OccludingNode,其后面的任何内容都不会呈现。