This is precisely why I think it’s a rounding error, granted I could be wrong.
There’s couple things you should do. You decide the order cause like I said it could be texturing.
When you create two adjacent blocks check to see if you are referencing the exact same vertex positions, for the points that touch. If you don’t you will get rounding errors leading to edges that don’t quite line up. This could be where the problem comes from.
Also, see if you can replicate the issue without using the texture atlas. If you can the issue is definitely from the above scenario.
Another thing I noticed is that you have an odd cast in getUV():
public Vec2f getUV(final int x, final int y) {
-return new Vec2f(((float) x) / this.pixelWidth, ((float) y) / this.pixelHeight);
+return new Vec2f((float) x / (float) this.pixelWidth, (float) y / (float) this.pixelHeight);
}
Granted since it was the denominator I’m not sure it will make a difference.
Last thing I can think of is I recommend changing GL_NEAREST to GL_LINEAR (You actually might try this first as it’s easiest).