скорее всего из-за того, что выключена проверка глубины( удалённость от наблюдателя). Можно вручную реализовать алгоритмы, можно использовать z-buffer. Для этого нужно
добавить GLUT_DEPTH в glutInitDisplayMode
включить тест глубины glEnable(GL_DEPTH_TEST)
в функции перерисовки экрана добавить GL_DEPTH_BUFFER_BIT в glClear
kolaider ответил правильно, я только хочу объяснить поподробнее.
Когда происходит вывод объектов на экран, компьютер не знает какой из них должен быть поверх другого. Поэтому поверх всех остальных объектов будет выведен тот, который обрабатывался позже всех. Чтобы этого избежать нужно включить проверку глубины. Это специальный буфер, в котором каждый пиксель характеризуется не цветом, а удаленностью от наблюдателя (глубина z). Поэтому когда в этой же точке нужно будет нарисовать другой пиксель, глубина z нового пикселя будет сравниваться с новым значением. Если новое значение меньше, значит новая точка находится ближе к наблюдателю => она должна быть нарисована поверх старой. Аналогично, наоборот.
Такую удобную штуку нам дает буфер глубины, где хранятся "глубины" всех пикселей экрана.
Чтобы его включить, нужно сделать то, что kolaider прописал:
1. добавить GLUT_DEPTH в glutInitDisplayMode. Я так же как и он использую библиотеку GLUT (которую и Вам советую как начинающему), поэтому этот шаг верен только для нее. Например, у меня обычно вызов такой:
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
2.glEnable(GL_DEPTH_TEST). Это обязательно сделать в любом случае.
3.в функции перерисовки экрана добавить GL_DEPTH_BUFFER_BIT в glClear. Аналогично обязательно. У меня, например, вызов такой:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);