Estou tentando escrever um pequeno mecanismo voxel porque é divertido, mas luto para encontrar a melhor maneira de armazenar os voxels reais. Estou ciente de que precisarei de algum tipo de pedaço para não precisar ter o mundo inteiro na memória e estou ciente de que preciso renderizá-lo com desempenho razoável.
Eu li sobre octrees e, pelo que entendi, começa com 1 cubo, e nesse cubo pode haver mais 8 cubos, e em todos esses 8 cubos podem haver outros 8 cubos etc. Mas não acho que isso se encaixe no meu motor voxel porque meus cubos / itens de voxel terão exatamente o mesmo tamanho.
Portanto, outra opção é apenas criar uma matriz de tamanho 16 * 16 * 16 e ter um pedaço, e você a preencherá com itens. E partes onde não existem itens terão 0 como valor (0 = ar). Mas receio que isso desperdice muita memória e não seja muito rápido.
Outra opção é um vetor para cada pedaço e preencha-o com cubos. E o cubo mantém sua posição no bloco. Isso economiza memória (sem bloqueios de ar), mas torna a procura de um cubo em um local específico muito mais lenta.
Portanto, não consigo realmente encontrar uma boa solução, e espero que alguém possa me ajudar com isso. Então, o que você usaria e por quê?
Mas outro problema está sendo processado. Basta ler cada pedaço e enviá-lo para a GPU usando o OpenGL é fácil, mas muito lento. Gerar uma malha por pedaço seria melhor, mas isso significa que toda vez que eu quebro um bloco, tenho que reconstruir o pedaço inteiro, o que pode demorar um pouco, causando um soluço menor, mas perceptível, o que obviamente eu também não quero. Então isso seria mais difícil. Então, como eu renderizaria os cubos? Basta criar todos os cubos em um buffer de vértice por bloco e renderizar isso e talvez tentar colocar isso em outro thread, ou existe outra maneira?
Obrigado!