7
votes

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?

1
Would be interesting to see if Apple supports occlusion in ARKit/SceneKit. From what limited amount I've seen of SceneKit so far, it seems like it doesn't? Occlusion math is complicatedxta
Could you link to those examples?diviaki

1 Answers

6
votes

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