'Occlusion Material or Hold-Out Shader in ARKit and SceneKit

I have seen some examples demo of ARKit where material A is blocking material B, kind of creating occlusion effect, or black hole, or masking. But all of them seems to be using Unity engine (I might be wrong). I wanted to do this using what Apple provide already. Or maybe using Metal Shader.

Wondering if anyone knows a trick that allows this for ARKit or even in SceneKit term, when 2 objects are overlapping, but wanting one object to occlude the other object, leaving the other object empty. It cannot be CSG right, because that would be too expensive?



Solution 1:[1]

Yes, it's definitely possible to use a 3D object as a hold-out mask, a.k.a. Occlusion Material in iOS and macOS apps. An instance property, called .colorBufferWriteMask, actually writes depth channel information when rendering the material. So you need the following value for this property for masking object:

sphere.geometry?.firstMaterial?.colorBufferWriteMask = []

...and don't forget to assign an appropriate rendering order (closest to the camera):

sphere.renderingOrder = -50  

..and give two values that determine whether SceneKit produces depth information when rendering the material or not:

sphere.geometry?.firstMaterial?.writesToDepthBuffer = true
sphere.geometry?.firstMaterial?.readsFromDepthBuffer = true

enter image description here

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1