Вы не проверяете IN OpenGL, если объект виден.
Для этого у вас должны быть свои собственные алгоритмы видимости / отбраковки.Это означает BSP Trees, Portals, Octree и другие.В зависимости от сложности мира вы можете отделаться пространственным разделением на основе сетки или чего-то еще.Это действительно зависит от того, что вы делаете.
Помните, OpenGL известен только Draw и Cull.
Вы можете сделать цикл для всех объектов в вашем мире и сказать GL, чтобы они нарисовали их всепо одному.Каждый из них будет обработан и отброшен, если не будет виден.Конечно, это грубая сила и медлительность.
Отсюда необходимость более обширных алгоритмов отбраковки.
Как вы думаете, почему в графических движках есть все эти миллионы строк?: D