Hay un par de aspectos de este problema. En primer lugar, ¿cómo estás dibujando tus 10000 bloques? ¿Realmente los estás dibujando como 10000 objeto separado? Si es así, esto es casi seguro su cuello de botella, no la falta de eliminación de oclusión. Debería agrupar estos bloques en un número menor de mallas (quizás unos pocos miles por malla) para reducir las llamadas de extracción.
En cuanto a su pregunta real, hay tres tipos de eliminación de oclusiones que me vienen a la mente.
1) Bloques fuera de la vista frustum. Esto significa bloques que están detrás de ti o dos a un lado. Ogre ya los elimina a través del sacrificio de vista frustum.
2) Bloques que están 'subterráneos' o completamente rodeados por otros bloques para que nunca se puedan ver desde ningún ángulo. Puede identificarlos mirando los bloques vecinos siz. Si todos son sólidos, su bloque está oculto. La GPU nunca debería escuchar acerca de estos bloques; deben omitirse cuando está construyendo la malla que representa su superficie.
3) Bloques que están en la superficie y se pueden ver desde algunas posiciones en el nivel, pero que actualmente están ocultos por una colina (o algo así). Este es el caso más complicado que no he abordado, pero hay una buena posibilidad de que las consultas de oclusión de hardware se puedan utilizar para este caso.
Es un complemento descarado, pero tengo una biblioteca bastante madura que varias personas usan para desarrollar clones de Minecraft, incluidos algunos que usan Ogre. Usted define el contenido del volumen y genera la malla de superficie que luego puede renderizar. Aquí está la página de inicio:
http://www.thermite3d.org/
Y aquí hay un video del proyecto de otra persona que lo está usando:
http://www.youtube.com/watch?v=Jju6WRPEK7o
Si tiene 10000 objetos separados, el cuello de botella es probablemente un recuento primitivo, no vértice, polígono o relleno. Hornee sus objetos en un número menor de objetos poligonales más altos para mayor velocidad.
Minecraft tiene un concepto de bloques de cubos, pero no puedo encontrar la referencia en este momento.
Aquí también están mis experimentos para dibujar toneladas de cubos con varias técnicas. No incluye hornear (todavía).
fuente
Lo que hago es después de crear mi conjunto de bloques, pero antes de crear los vértices, ejecuto un sub llamado UpdateBlockVisiblility.
El submarino simplemente verifica los vecinos del bloque y actualiza los bloques booleanos visibles en consecuencia.
¡Entonces solo creo los vértices para la cara si es visible! Sencillo :)
fuente