If you look closely, in picture 2, the x position of my first F is 0 even though the rasterPosition is 1.
Sometimes it’s not just first F. It could be second one or third one…
Bitmaps are rendered using the current raster colour. The current raster colour is set by glRasterPos() from either the current colour or (if lighting is enabled) the colour produced by the lighting equations. As you only call glRasterPos() once, all of the bitmaps have the same colour.
The coordinates passed to glRasterPos() are transformed by the current model-view and projection matrices to obtain window coordinates. These are floating-point values which are rounded down to an integer (as if by floor()) in order to determine the bitmap position. If the computed window coordinates lie on the boundary between pixels, even the smallest error could affect the result.
Try adjusting the coordinates passed to glRasterPos() so that the transformed coordinates lie in the centre of the pixel rather than at the corner. Or try using glWindowPos() rather than glRasterPos().