Any time your meshing process results in the corner of a triangle resting on the edge of another triangle, you get a T-Junction.

While this gap between the corner and the edge is infinitely small mathematically, it absolutely isn't in practice, due to floating-point computation and rounding.

This always happens, even if you've managed eliminate all floating-point errors.

There are four ways to work around this issue:

  1. Expand the faces ever so slightly outwards.
  2. Fill the pixel-wide gaps in a post-process shader.
  3. Don't create geometry where vertices can lie on edges.
  4. Directly raytrace your voxel volume.