【问题标题】:SceneKit Culling PlaneSceneKit 剔除平面
【发布时间】:2017-12-16 14:12:25
【问题描述】:

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

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

是否有任何属性/设置/着色器可以应用到透明立方体上,这样它后面的任何东西都不会被渲染?

例子:

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

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

亲切的问候

克里斯

【问题讨论】:

  • 你想看什么?截图和草图会有很大帮助。
  • 我添加了一张图片以便更好地了解我的需求。
  • 必须在那里渲染一些东西; “隐形”不是一种颜色。在被透明立方体遮挡的红/紫球部分,应该画什么?黑色的?白色的?球后有物体?您能否发布您现在拥有的屏幕截图,并描述它与您想要的有何不同?
  • 理想情况下,什么都没有,你只会看到红色的一面:-/
  • 如果紫色是透明的,那就太好了!

标签: ios swift graphics scenekit


【解决方案1】:

解决办法

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

【讨论】:

  • 你有样品吗?我试过这个: if let cube = scene.rootNode.childNode(withName: "invisible", recursively: true) { let material = SCNMaterial() material.lightingModel = .constant material.writesToDepthBuffer = true material.colorBufferWriteMask = [] cube.geometry?.materials = [材质] cube.renderingOrder = -1 }
  • 知道了,它不能在飞机上工作,但是一个扁平的立方体工作得很好!
  • 啊!我的飞机颠倒了 - 谢谢!
  • renderingOrder = -1 我已经找了好几个星期了。非常感谢!
  • 不使用这种技术。片段要么通过深度测试,要么失败。
【解决方案2】:

基于@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,它后面的任何东西都不会被渲染。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    相关资源
    最近更新 更多