Yes, this is an unfortunate side effect of some subtle differences between OpenGL pixel shaders and direct pixel processing on the CPU. In OpenGL, the sampling coordinates are generated by rasterizing a quad and interpolating across the rasterized pixels. This produces slightly different 2d coordinates, which accounts for the difference you're seeing. You can use the [nearest] operator to have better results on the CPU. In the end, the solution for using [sample] will be some kind of different sampling mode that's equivalent to what happens in OpenGL.