Doing it with geometry will get you the same artifacts. You can get rid of the artifacts by modifying the remapping rectangle to be half a pixel shorter on each side. You could also do something more complicated with custom bilinear filtering at the edges if you really want it to be 100% accurate. Edit: Oh you mean the…
the block artifact arise from using fmod(). the screenspace derivative for a block where the new uvs go from 0.999 to 0 is pretty big so the shader does the "right thing" and samples a lower mipmap. the clue is in the fact that the blocks are 2x2 pixels large. you can obviously get around it by not using mipmaps, but…