Basically a panini projection is projecting vertices onto a cylinder (if I get it right), which is then unrolled on screen.
Here is how blinky, a quake mode, is doing is, using some LUA script:
Not sure it’s a real projection since it’s using globes and lenses.
The thing about non-linear projections is that the projection of a straight line isn’t a straight line. So you can’t project a triangle simply by projecting the vertices. Typically, you’d either use tessellation to get a sufficient approximation, or project onto the faces of a cube map and then project the cube map as a post-processing step using a fragment shader.