Dos ideas que tengo en mente:
1) La escena se representa en un búfer invisible, utilizando modelos de baja resolución y bajo recuento de polígonos (o incluso utilizando solo volúmenes delimitadores como cubos o esferas). Luego se verifica el búfer para saber qué es visible o no. Antes de renderizar la escena de baja resolución, se podría aplicar un sacrificio de frustum para eliminar la mayor cantidad de objetos posible.
2) Se ejecuta una herramienta en el mapa estático y realizará un trazado de rayos complejo (y, por lo tanto, lento) para saber para algunas posiciones 3D en el mapa qué es visible y qué no. Toda esa información se almacena de manera eficiente que puede ser utilizada posteriormente por el usuario en tiempo de ejecución (p. Ej .: un octree). Esta solución solo funcionaría para mallas estáticas (p. Ej .: edificio) que no mueven objetos.