Fragment shaders work on screen pixels, not texture pixels. In pixel-art styles 1 pixel in your art is going to be rendered over a bunch of screen pixels
That means you'll have different data for different parts of a texture pixel-> so you won't get the neat per-art-pixel look
The solution is to snap our data to an art pixel-grid.
We're gonna need to align both vertex positions and fragment positions to our pixel grid.
First, the vertex snapping, in the vert shader:
Next we snap individual fragment positions, so everything in the same grid square gets the same value.
Lastly, make sure in your texture import settings your Mesh Type is set to 'Full Rect'.
With 'Tight' Mesh Type the art pixels aren't going to be grid-aligned in the generated mesh, so you'll get the wrong values.
Now that you've got shared values per fragment you can do any sort of lighting shaders without breaking the pixel-art grid!
I'll probably be releasing my Pixel-light shader together with #BoneToPix in February.