Estoy tratando de escribir un pequeño motor de vóxel porque es divertido, pero me cuesta encontrar la mejor manera de almacenar los vóxeles reales. Soy consciente de que necesitaré trozos de algún tipo, así que no necesito tener todo el mundo en la memoria, y sé que necesito renderizarlos con un rendimiento razonable.
Leí sobre octrees y, por lo que entiendo, comienza con 1 cubo, y en ese cubo puede haber 8 cubos más, y en todos esos 8 cubos puede haber otros 8 cubos, etc. Pero no creo que esto se ajuste a mi motor de vóxel porque mis cubos / artículos de voxel serán todos exactamente del mismo tamaño.
Entonces, otra opción es simplemente crear una matriz de tamaño 16 * 16 * 16 y hacer que sea un fragmento, y llenarlo con elementos. Y las partes donde no hay ningún artículo tendrán 0 como valor (0 = aire). Pero me temo que esto va a desperdiciar mucha memoria y no será muy rápido.
Luego, otra opción es un vector para cada fragmento y llenarlo con cubos. Y el cubo mantiene su posición en el trozo. Esto ahorra memoria (sin bloqueos de aire), pero hace que la búsqueda de un cubo en una ubicación específica sea mucho más lenta.
Así que realmente no puedo encontrar una buena solución, y espero que alguien pueda ayudarme con eso. Entonces, ¿qué usarías y por qué?
Pero otro problema es el renderizado. Simplemente leer cada fragmento y enviarlo a la GPU usando OpenGL es fácil, pero muy lento. Generar una malla por fragmento sería mejor, pero eso significa que cada vez que rompo un bloque, tengo que reconstruir todo el fragmento, lo que podría llevar un poco de tiempo y causar un hipo menor pero notable, que obviamente tampoco quiero. Entonces eso sería más difícil. Entonces, ¿cómo renderizaría los cubos? Simplemente cree todos los cubos en un búfer de vértices por fragmento y renderícelo, y tal vez intente ponerlo en otro hilo, ¿o hay alguna otra forma?
¡Gracias!