He estado echando una ojeada y he tenido mucho en mente lo que decíais sobre cargar una y otra vez los vertexbuffers, por aquello de que cuanto menos cpu haya de por medio mejor. Que os parece un vertex buffer general para toda la escena, y que cada poliedro utilice su propio index buffer. Claro que ésto solo funcionará para escenas pequeñas, no puedo guardar un vertexbuffer para una malla de terreno compleja en la gpu no??? o si?
En un prinicipio, tampoco pasa nada por tener unos cuantos vertex buffers.
Hay juegos (aunque más antiguos) que tenian toda le geometria del escenario en una malla, aunque solo se dibujará parte de la misma. Pero tambien tienes que tener en cuenta si quieres que haya "instancias" de una misma geometria.
Al final la geometria de la escena la deberias tener en memoria de gpu (aunque hay API y plataformas que te permiten tener buffers en memoria principal, y hay algunos dispositivos que tienen la memoria compartida CPU/GPU).
Otra cosa es que sea un "mundo" muy grande, con lo que tienes que tirar de "streamming", pero lo que visualizas lo tienes que "tener cargado", de eso nadie te salva.
Lo que tienes que tener en cuenta son los "draw-calls". Para dibujar con "un material diferente", debes de lanzar un draw-call por cada objeto, y entre ellos, cambiar el estado del renderer (o encolar un display list, dependiendo de la API).
No hay solución mágica, ni un camino fácil ... las APIs son tan "flexibles" a la vez que "complejas" para permitir hacer las "guarrerias" que hagan falta con tal de rascar 1ms más en cada frame.
Tienes más de un camino válido y eficiente, pero por desgracia, hay más de 100 "malos" e ineficientes. Mi consejo es que busques el equilibrio, y no te obsesiones con "generalizarlo" todo. Para mi las mejores soluciones son las soluciones especificas, si estuviera inventada ya la solución mágica para todo, sobrariamos los ingenieros.
Un saludo y suerte
