SceneKit 裁剪平面

7

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

我有一个透明的立方体,当我的其中一个模型走到它的后面时,我希望该模型不被渲染,因为目前,由于立方体是透明的,你可以透过它看到模型。

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

示例:

我的眼睛是绿点,立方体是蓝色正方形,我的模型是红色圆圈,但被立方体隐藏的部分是紫色...实际上应该是看不见的。蓝色正方形也将是看不见的。

Cull

这位开发者有一个遮挡着色器,正好符合我的需求,但它是Unity的:https://youtu.be/MK3D91kCKzM 敬礼,
Chris

你想看到什么?提供一张截图和草图会非常有帮助。 - Hal Mueller
我已经添加了一张图片,以便更好地说明我需要什么。 - Chris
好的,那里必须要渲染一些东西;“隐形”不是一种颜色。在透明立方体遮挡住的红/紫色球的部分,应该绘制什么?黑色?白色?球后面的物体?您能否发布一张当前的屏幕截图,并描述它与您想要的有何不同? - Hal Mueller
理想情况下,你只能看到红色的边缘 :-/ - Chris
那么您想要渲染场景或者SCNView背后的视图背景? - jlsiewert
显示剩余2条评论
2个回答

18

这里有一个解决方案:

  1. 对于立方体,使用具有 constant 作为其 lightingModel 的材质。这是最便宜的。
  2. 此材料将设置writesToDepthBuffertrue,并将colorBufferWriteMask设置为[](空选项集)。这样立方体将写入深度缓冲区,但不会在屏幕上绘制任何东西。
  3. 将立方体的renderingOrder设置为-1,以便在场景中的任何其他节点之前绘制它。这将使立方体在任何其他对象之前写入深度缓冲区,如果它们在立方体后面,则防止它们被绘制。

你有样例吗?我尝试了这个代码:如果场景中的 rootNode 下存在名称为“invisible”的子节点,则定义一个 material 变量,设置其 lightingModel 为.constant,writesToDepthBuffer 为 true,colorBufferWriteMask 为空数组。接着将该 material 赋值给 cube 几何体的材质,设置 cube 的渲染顺序为 -1。 - Chris
它应该与“SCNPlane”一样正常工作。只需确保其正确定位,以便面向相机即可。 - mnuages
1
糟糕!我的飞机倒挂了 - 谢谢! - Chris
2
渲染顺序 = -1。我已经找了好几周了。非常感谢你! - elmarko
1
不是用这种技术。一个片段要么通过深度测试,要么失败。 - mnuages
显示剩余3条评论

1

根据@mnuages答案,您可以使用以下类:

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,那么它之后的所有东西都不会被渲染。

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