Mapas de altura
Com um mapa de altura, você armazena apenas o componente de altura para cada vértice (geralmente como textura 2D) e fornece posição e resolução apenas uma vez para todo o quadrilátero. A geometria da paisagem é gerada em cada quadro usando o shader de geometria ou mosaico de hardware. Os mapas de altura são a maneira mais rápida de armazenar dados de paisagem para detecção de colisão.
Prós:
Uso de memória relativamente baixo : você só precisa armazenar um valor por vértice e nenhum índice. É possível melhorar ainda mais isso usando mapas de detalhes ou um filtro de ruído para aumentar os detalhes percebidos.
Relativamente rápido : o sombreador de geometria para mapas de altura é pequeno e corre rápido. Porém, não é tão rápido quanto o terreno da geometria.
Em sistemas sem aceleração 3D baseada em triângulo, os mapas de altura da marcha com raios são a maneira mais rápida de renderizar o terreno. Isso foi chamado de gráficos voxel em jogos mais antigos.
LOD dinâmico / terreno : é possível alterar a resolução da malha gerada com base na distância da câmera. Isso causará a alteração da geometria se a resolução cair muito (cerca de 0:40), mas pode ser usada para efeitos interessantes.
Fácil geração / criação de terrenos : os mapas de altura podem ser facilmente criados através da combinação de funções de ruído, como os editores fractal Perlin Noise e heightmap, são rápidos e fáceis de usar. Ambas as abordagens podem ser combinadas. Eles também são fáceis de trabalhar em um editor.
Física eficiente : uma posição horizontal é mapeada diretamente para (geralmente) uma a quatro posições na memória, portanto, as pesquisas de geometria na física são muito rápidas.
Contras:
Exatamente uma altura por coordenada x / y : geralmente não pode haver buracos no chão ou falésias pendentes.
Menos controle : você só pode controlar a altura precisa de cada ponto se o tamanho da grade corresponder às coordenadas da textura.
Artefatos : se os quatro vértices que definem um sub-quadrante não estiverem no mesmo plano, a divisão entre os dois vértices se tornará visível. Isso geralmente acontece em penhascos íngremes com arestas que não seguem uma direção cardinal.
Os mapas de altura são a maneira mais eficiente de renderizar terreno de longe e são usados em muitos jogos mais recentes que não contam com recursos avançados de terreno e têm grandes áreas externas. A Wikipedia tem uma lista de programas que usam mapas de altura , mas não tenho certeza se isso significa que eles apenas os usam como recursos ou também para renderização, então aqui estão alguns jogos que provavelmente os usarão:
Just Cause 2: As regiões são carregadas em setores quadrados e não há buracos no terreno. Na demonstração, há um buraco profundo com triângulos esticados ao longo das bordas, onde normalmente haveria um edifício. (A área é normalmente inacessível, mas existem mods para remover algumas das limitações da demonstração ...)
Sims 2 ( talvez ): o terreno da vizinhança é carregado como mapa de altura, mas existem buracos nos locais onde os lotes (locais de construção) são colocados. No entanto, existem artefatos típicos se você criar muitas falésias, e é muito entediante adicionar uma adega a uma casa (e esconder a falésia sob uma varanda).
Jogos de mecanismo de origem da válvula: escovas retangulares (geometria de nível estático) podem ter terrenos mapeados em altura em suas faces. Nestes jogos, as peculiaridades habituais costumam ser escondidas com outros pincéis ou acessórios.
É impossível ter certeza sem olhar para os shaders, porque todo terreno do mapa de altura pode ser renderizado como malha.
Voxels
O terreno da Voxel armazena dados do terreno para cada ponto em uma grade 3D. Esse método sempre usa o máximo de armazenamento por detalhes significativos da superfície, mesmo se você usar métodos de compactação, como esparsas octrees.
(O termo "mecanismo voxel" costumava ser usado para descrever um método de mapas de altura de terreno marchar com raios comuns em jogos 3D mais antigos. Esta seção se aplica apenas ao terreno armazenado como dados voxel.)
Prós:
Dados 3D contínuos : os voxels são praticamente a única maneira eficiente de armazenar dados contínuos sobre recursos de terrenos ocultos, como veios de minério.
Fácil de modificar : dados voxel não compactados podem ser alterados facilmente.
Recursos avançados do terreno : é possível criar saliências. Túneis são sem costura.
Geração de terreno interessante : o Minecraft faz isso sobrepondo funções e gradientes de ruído com recursos de terreno predefinidos (árvores, masmorras). (Leia Geração de terrenos, Parte 1 no blog do Notch para obter mais informações. Não há parte 2 a partir de 05.8.2011.)
Contras:
Lento : para renderizar dados de voxel, é necessário usar um traçador de raios ou computar uma malha, por exemplo, com cubos de marchas (haverá artefatos). O voxel vizinho não é independente para a geração de malha e os shaders são mais complicados e geralmente produzem geometria mais complexa. A renderização de dados voxel com alto LOD pode ser muito lenta.
Grandes requisitos de armazenamento : o armazenamento de dados voxel usa muita memória . Muitas vezes, não é possível carregar os dados do voxel na VRAM por esse motivo, pois você precisará usar texturas menores para compensar isso, mesmo em hardware moderno.
Não é prático usar voxels para jogos que não dependem dos recursos do voxel, como terrenos deformáveis, mas, em alguns casos, pode permitir mecânica de jogo interessante. Os mecanismos Voxel são mais comuns em jogos mais antigos , mas também existem exemplos mais recentes:
Motor Atomontage : renderização Voxel.
Worms 4: usa "poxels". Segundo a Wikipedia, é uma mistura de voxels e polígonos.
Minecraft: usa voxel para representar o terreno na RAM, os gráficos são gráficos poligonais. É principalmente software calculado embora.
Terraria: um exemplo para voxels 2D. Não sei como se processa.
Voxels combinados com a física : não é um jogo. mas mostra bem o potencial de destruição.
Voxatron : Um jogo usando voxels para quase todos os gráficos, incluindo menus e HUD.
Malhas
As malhas poligonais são a maneira mais flexível e precisa de armazenar e renderizar terrenos. Eles são frequentemente usados em jogos onde são necessários recursos precisos de controle ou terreno avançados.
Prós:
Muito rápido : você só precisa fazer o cálculo de projeção usual no sombreador de vértices. Um shader de geometria não é necessário.
Muito preciso : todas as coordenadas são armazenadas individualmente para cada vértice, portanto, é possível movê-las horizontalmente e aumentar a densidade da malha em locais com detalhes mais refinados.
Baixo impacto na memória : isso também significa que a malha geralmente precisará de menos memória que um mapa alto, porque os vértices podem ser mais esparsos em áreas com menos recursos.
(Veja Rede irregular triangulada na Wikipedia).
Sem artefatos : a malha é renderizada como está, para que não haja falhas ou bordas de aparência estranha.
Recursos avançados do terreno : é possível deixar buracos e criar saliências. Túneis são sem costura.
Contras:
LOD dinâmico ruim : só é possível com malhas pré-computadas. Isso causará "saltos" ao alternar sem dados adicionais para mapear antigos para novos vértices.
Não é fácil de modificar : a localização dos vértices que correspondem a uma área que deve ser modificada é lenta.
Não é muito eficiente para a detecção de colisões : diferentemente dos mapas de altura e dados voxel, o endereço de memória para um determinado local geralmente não pode ser calculado diretamente. Isso significa que a física e a lógica do jogo que dependem da geometria exata da superfície provavelmente serão mais lentas do que nos outros formatos de armazenamento.
O terreno poligonal é frequentemente usado em jogos que não têm grandes áreas abertas ou não podem usar terrenos com mapas de altura devido à sua falta de precisão e saliências. Não tenho uma lista, mas tenho certeza de que
todo Zelda 3D e
todo jogo Mario 3D
usa isto.
Outros métodos
É possível criar um terreno inteiramente no pipeline do shader. Se o algoritmo for executado apenas no sombreador de fragmento / pixel, os detalhes poderão ser virtualmente ilimitados enquanto o impacto na memória é quase zero. As desvantagens óbvias quase não têm controle sobre a forma e os problemas quando a câmera cruza a superfície de renderização original. Ainda é útil em jogos espaciais, onde os jogadores não interagem com a superfície de um planeta. As animações de parâmetros funcionam melhor com esse tipo de terreno.
Deve ser possível fazer o download da geometria do terreno gerada da placa de vídeo para usá-la no restante do mecanismo de jogo, mas não sei como é o desempenho disso ou se isso foi feito até agora.
Conclusão
Não existe um método que funcione bem para todos os cenários, mas é bastante fácil escolher um para uma determinada tarefa:
Os mapas de altura são a melhor solução se você não precisar de saliências ou furos na superfície do terreno e usar física ou terreno dinâmico. Eles são escaláveis e funcionam bem para a maioria dos jogos.
As malhas têm a mais alta precisão e podem descrever saliências, furos e túneis. Use-os se você tiver terreno complexo que não mude com frequência.
Os voxels são bons para descrever terrenos muito dinâmicos com muitos recursos complexos. Evite renderizá-los diretamente, pois eles precisam de grandes quantidades de memória e processamento.
Outros métodos podem ser melhores do que os acima mencionados, se você não precisar interagir com o terreno ou precisar de gráficos muito detalhados. Eles geralmente funcionam apenas para cenários muito específicos.
É possível combinar métodos diferentes para obter recursos de mais de um, por exemplo, pavimentando terrenos de malha com um mapa de altura para aumentar a estrutura de detalhes de um penhasco.
A geração dinâmica de terrenos é muito usada na simulação de procedimentos de espaço e algumas se tornaram realmente avançadas nos últimos anos . Os fóruns desses projetos devem ter alguns recursos sobre o tema.