是否有可能有一个 SCNNode 是透明的,但它遮挡了它后面的任何对象?
Is it possible to have a SCNNode which is transparent, but which occludes any object behind it?
所以要明确我的目标,因为我没有任何代码可以共享...可以说我有一个位于相机和另一个 SCNNode 之间的 SCNNode。第一个 SCNNode 是一个 SCNBox,但没有纹理,因此可以在它后面看到第二个 SCNNode。我想给第一个节点一个透明的 material,但让它也遮挡它后面的所有节点,就好像它是不透明的一样。在常规场景中,这意味着你可以看到场景背景颜色,也许是黑色,但我计划在 ARKit 中这样做,这更有意义,因为这意味着你只会看到它背后的真实世界。
我已经从评论中测试了我的想法,它似乎可行,但并不完美,但我稍后会在这一点上进行扩展。
为了支持渲染过程,SceneKit 使用深度缓冲区并仅在该点位于所述缓冲区中保存的内容之前渲染一个点,因此我们必须告诉 SceneKit 先渲染你的透视立方体,然后再渲染所有其他节点,因此将立方体节点 renderingOrder
属性 保留为 0
(默认值),然后将所有其他节点 renderingOrder
设置为更高的值,即 1
, 10
... 通常对于透明物体你不想写入深度缓冲区所以你可以看到后面的物体但事实并非如此所以离开你的立方体material writeToDepthBuffer
属性 到 true
(默认值)。最后要做的是让你的立方体透明,你可以使用默认的 material 然后添加
cube.geometry?.firstMaterial?.transparency = 0.00000001
正如我之前所说,这种方法并不完美,感觉更像是一种解决方法……但它确实有效。我们不将透明度设置为 0
的原因是如果我们这样做就像立方体不存在一样,即完全透明的像素不会保存到深度缓冲区。
您可以使用 material 颜色清晰:
extension SCNMaterial {
convenience init(color: UIColor) {
self.init()
diffuse.contents = color
}
convenience init(image: UIImage) {
self.init()
diffuse.contents = image
}
}
let clearMaterial = SCNMaterial(color: .clear)
boxNode.materials = [clearMaterial]
所以要明确我的目标,因为我没有任何代码可以共享...可以说我有一个位于相机和另一个 SCNNode 之间的 SCNNode。第一个 SCNNode 是一个 SCNBox,但没有纹理,因此可以在它后面看到第二个 SCNNode。我想给第一个节点一个透明的 material,但让它也遮挡它后面的所有节点,就好像它是不透明的一样。在常规场景中,这意味着你可以看到场景背景颜色,也许是黑色,但我计划在 ARKit 中这样做,这更有意义,因为这意味着你只会看到它背后的真实世界。
我已经从评论中测试了我的想法,它似乎可行,但并不完美,但我稍后会在这一点上进行扩展。
为了支持渲染过程,SceneKit 使用深度缓冲区并仅在该点位于所述缓冲区中保存的内容之前渲染一个点,因此我们必须告诉 SceneKit 先渲染你的透视立方体,然后再渲染所有其他节点,因此将立方体节点 renderingOrder
属性 保留为 0
(默认值),然后将所有其他节点 renderingOrder
设置为更高的值,即 1
, 10
... 通常对于透明物体你不想写入深度缓冲区所以你可以看到后面的物体但事实并非如此所以离开你的立方体material writeToDepthBuffer
属性 到 true
(默认值)。最后要做的是让你的立方体透明,你可以使用默认的 material 然后添加
cube.geometry?.firstMaterial?.transparency = 0.00000001
正如我之前所说,这种方法并不完美,感觉更像是一种解决方法……但它确实有效。我们不将透明度设置为 0
的原因是如果我们这样做就像立方体不存在一样,即完全透明的像素不会保存到深度缓冲区。
您可以使用 material 颜色清晰:
extension SCNMaterial {
convenience init(color: UIColor) {
self.init()
diffuse.contents = color
}
convenience init(image: UIImage) {
self.init()
diffuse.contents = image
}
}
let clearMaterial = SCNMaterial(color: .clear)
boxNode.materials = [clearMaterial]