So my end solution was found in this paper, which incidentally was implamented in threejs. The solution is literally just to project the fragment’s normal onto the view plane, and take the x and y coordinates of it. End result looks okay.
Could be better, it currently runs at like 30-40fps on my laptop and I think the edges are too hard, and it also looks a bit too blurry in the back. It also has a shower door effect everyone tries to avoid as the strokes are stuck to the camera instead of the objects.