The issue is you’re pointing at the edges between texels.
These lines
geoX.push(tx / imageSize);
geoY.push(1.0 - ty / imageSize); // flip y
compute the exact edge between texels. What I mean by that is lets say imageSize
is 4 texels and lets say tx
and ty
go from 0
to 3
Your texture coordinates go like this
0 0.25 0.5 0.75 <- texture coords you're computing
| | | |
V V V V
+-----+-----+-----+-----+
| | | | |
| | | | | <- texels
+-----+-----+-----+-----+
But the texture coords you want are like this
0.125 0.375 0.625 0.875
| | | |
V V V V
+-----+-----+-----+-----+
| | | | |
| | | | | <- texels
+-----+-----+-----+-----+
The easiest fix is to add 1/2 a texel
geoX.push(tx / imageSize + 0.5 / imageSize);
geoY.push(1.0 - ty / imageSize + 0.5 / imageSize); // flip y
The problem is with your math pointing directly between texels rounding errors make it pick one texel or the other. Choosing the center of the texel will fix that. If the image didn’t have so much contrast between neighboring texels you might not have noticed.