'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
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 |