la ligne fautive est :
gluPerspective (45, float(width)/float(height), 0, 100);
le problème : les deux derniers paramètres sont respectivement le znear et le zfar. s'il peut sembler logiquer de mettre le znear à zéro, c'est mal et ça cause justement ce genre de problèmes je n'ai plus le pourquoi du comment en tête, mais je crois me souvenir que c'est un problème de précision. le z buffer stocke z, linéaire dans l'espace, hyperbolique dans le plan de l'écran. en pratique plus tu mets un znear petit plus la précision est grande vers celui ci, laissant par ex 95% des valeurs du zbuffer pour z = [0, 0.0001] par ex. d'où très peu de valeurs du zbuffer pour z = [0.0001+, zfar], d'où chevauchement de faces.
bon, bref, tu changes ton znear à 1 par ex, et hop. sinon y'a le wbuffer qu'est plus précis aussi, enfin mate un peu tout ça, et lit la doc de directx (même si tu fais de l'opengl, c'est pour la culture générale 3d).