http://www.glprogramming.com/dgs.php?dg=1
An Alternative to gluPerspective by Dranith
Motive
gluPerspective is a very very handy function for setting up the projection matrix. The only problem it has that I see is the FOV it takes is the FOV in the Y direction. So either you have no control over the FOV in the X direction, or you have the source to gluPerspective and you do some fancy trig to figure out the Y FOV value you need to input to get the desired X FOV.
Both these ways suck. So heres the code that lets you specify the FOV in the X direction. Code is based off the MESA implementation of gluPerspective.
Not to mention this is a point of confusion for people new to OpenGL. I didn't even notice that it took the Y FOV till a few days ago when I was doing something that I needed to be able to specify in X and things weren't working =).
Notes
Usage syntax is exactly the same as gluPerspective. This function assumes that GL_PROJECTION is the current matrix. This code is not optimised at all, but should only need to be called once.
--Dranith