layerMask is a property you can find on many objects and may be a bit difficult to grasp at first. This page should give you a good understanding of how it works accross Babylon.js objects.
layerMask is a value that can be assigned to different objects (like meshes, cameras, layers, particle systems, etc) and is used to determine the visibility of this object from another one (for eg, if a mesh is visible from a camera or if a layer should be displayed after a given camera is processed).
The only two things to understand with
layerMask are that:
- it can be any number from 0 to 0xFFFFFFFF (or 4294967295, but it’s easier to write 0xFFFFFFFF)
- when computing a visibility flag, two values of
layerMaskare ANDed and if the result is different from 0 the flag is true
So, for eg, if
camera.layerMask = 35 and
mesh.layerMask = 2,
35 & 2 == 2 != 0 so the mesh is visible from this camera. We often show these numbers in hexadecimal because doing the AND as a mental calculation is easier that way:
35 & 2 == 0x23 & 0x02 and from this latter representation it’s easier to see that the result is 2 (well, at least when you are a bit comfortable with hexadecimal!).
Usage in Babylon.js
In Babylon, by default all
layerMask properties are
0x0FFFFFFF (for Camera, Mesh, Layer, …). So, when it comes to determine a visibility,
0x0FFFFFFF & 0x0FFFFFFF != 0 and everything is always visible (at least from the standpoint of the
As you can see, there are 4 bits not set by default in the
layerMask (the leading
0 before the first
F). It’s to ease the use of
layerMask, as a common usage is to make some meshes hidden from a camera. To achieve that, you need to set a
layerMask on the meshes so that the AND operation with the
layerMask of the camera (
0x0FFFFFFF by default) is 0: you can use
0x80000000. Now you see why showing these numbers in hexadecimal helps: it’s a lot easier to see that
0x10000000 & 0x0FFFFFFF = 0 than
268435456 & 268435455!
If the default value for
0xFFFFFFFF, you would also need to update the
layerMask of your camera to have your meshes invisible from it because
0xFFFFFFFF is a all-one 32 bit value. So the
0x0FFFFFFF value is simply a default value that can help make your life a little easier, but in all generality you can put any value in the
layerMask property of cameras, meshes, layers, etc (as in the
35 & 2 example above) and simply understand how it is used to compute visibility.