Source: https://www.ljll.math.upmc.fr/~frey/cours/Roscoff/OpenGL.pdf