Desmistificar o "nível de detalhe fragmentado"

17

Recentemente, tentando entender a implementação de um sistema de nível de detalhe fragmentado no Unity. Vou gerar quatro planos de malha, cada um com um mapa de altura, mas acho que isso não é muito importante no momento. Depois de ler sobre essa técnica, tenho muitas perguntas. Espero que isso não seja pedir muito de uma vez, mas ficaria extremamente grato por alguém que me ajude a entender essa técnica.

1 : Não consigo entender em que ponto do pipeline do Chunked LOD a malha é dividida em pedaços. Isso ocorre durante a geração inicial da malha ou existe um algoritmo separado que faz isso.

2 : Entendo que uma estrutura de dados Quadtree é usada para armazenar os dados do Chunked LOD , acho que estou perdendo um pouco, mas o quadtree está armazenando dados de vértices e triângulos para cada nível de subdivisão?

3a : como é geralmente calculada a distância da câmera. Ao ler sobre as quadtree, as caixas delimitadoras alinhadas ao eixo são muito mencionadas. Nesse caso, cada pedaço teria uma caixa delimitadora de colisão para detectar que a câmera ou o player está próximo? ou existe uma maneira melhor de fazer isso? (raycast talvez?)

3b : Os pedaços calculam a distância da câmera eles mesmos?

4 : Cada pedaço tem a mesma "resolução". por exemplo, no nível superior, a malha terá 32x32, cada nó subdividido também terá 32x32. Exemplo abaixo:

exemplo de LOD fragmentado

Caius Eugene
fonte
Se alguém conhece uma abordagem LOD melhor para um planeta processual, isso também seria interessante.
Caius Eugene
Suponho que você já tenha consultado o artigo SIGGRAPH original de Thatcher Ulrich e o programa associado? tulrich.com/geekstuff/chunklod.html
drxzcl
Eu tenho, é muito informativo até certo ponto, mas não entra no tipo de detalhe ou nas abordagens de implementação. Obrigado
Caius Eugene
1
Há várias opções para o LOD planetário aqui; vterrain.org/LOD/spherical.html
OriginalDaemon

Respostas:

12

1: Não consigo entender em que ponto do pipeline do Chunked LOD a malha é dividida em pedaços. Isso ocorre durante a geração inicial da malha ou existe um algoritmo separado que faz isso.

Isso não importa. Por exemplo, você pode integrar o chunking ao seu algoritmo de geração de malha. Você pode fazer isso dinamicamente, de forma que níveis mais baixos sejam adicionados dinamicamente (por exemplo, à medida que o jogador se aproxima) usando um algoritmo de refinamento semelhante ao plasma. Você também pode gerar uma malha de alta resolução a partir dos dados de entrada do artista ou de medição de elevação e agregá-la a todos os blocos LOD no momento da finalização do ativo. Ou você pode misturar e combinar. Realmente depende da sua aplicação.

2: Entendo que uma estrutura de dados Quadtree é usada para armazenar os dados do Chunked LOD, acho que estou perdendo um pouco, mas o quadtree está armazenando dados de vértices e triângulos para cada nível de subdivisão?

Não necessariamente. A árvore apenas armazena informações sobre a geometria e como renderizá-la. Isso pode significar ter uma lista de vértices / faces em cada nó da árvore. Mais realista atualmente, você armazenaria os identificadores das malhas / instâncias na memória da GPU.

3a: Como é geralmente calculada a distância da câmera. Ao ler sobre as quadtree, as caixas delimitadoras alinhadas ao eixo são muito mencionadas. Nesse caso, cada pedaço teria uma caixa delimitadora de colisão para detectar que a câmera ou o player está próximo? ou existe uma maneira melhor de fazer isso? (raycast talvez?)

Uma opção muito barata e fácil é usar a distância até o ponto central do bloco e corrigi-lo. Você sabe que essa distância é sempre uma subestimação: se o ponto central estiver à distânciaZ , isso significa que metade do pedaço está mais perto do que isso. O que não sabemos, porém, é a orientação. Se estivermos vendo um pedaço de largura de wponta a ponta, o pedaço mais próximo do pedaço estará à distância Z-w. No entanto, se estivermos vendo o pedaço de canto primeiro, o bit mais próximo estará à distância Z-sqrt(2)*w. Se você pode conviver com essa incerteza (quase sempre pode), está feito. Observe que você também pode corrigir o ângulo de visão usando a trigonometria básica.

Prefiro calcular a distância mínima absoluta da câmera ao pedaço para minimizar os artefatos. Na prática, isso significa fazer um teste de distância ponto-quadrado . É um pouco mais trabalhoso do que calcular distâncias para os pontos centrais, mas não é como se você fizesse um zilhão desses em todos os quadros.

Se você pode alavancar seu mecanismo de física para fazer isso, faça-o de qualquer maneira, mas realmente deseja pensar mais em termos de "consulta à distância" do que em "colisão".

3b: Os pedaços calculam a distância da câmera eles mesmos?

Realmente depende do design do seu motor. Eu recomendaria manter as folhas relativamente leves. Dependendo da sua plataforma, apenas a sobrecarga de alguns milhares de trechos de terreno executam sua própria atualização, cada quadro pode afetar seriamente o desempenho.

4: Cada pedaço tem a mesma "resolução". por exemplo, no nível superior, a malha terá 32x32, cada nó subdividido também terá 32x32.

Eles não precisam, mas é conveniente se todos os pedaços ocuparem a mesma quantidade de espaço. Em seguida, você pode fazer o gerenciamento de memória (GPU) em unidades de "chunks". Também é mais fácil remover / ocultar as costuras entre dois pedaços de tamanhos diferentes, se uma resolução é múltipla da outra, porque eles compartilham mais vértices. (por exemplo: 32x32 e 64x64 é mais fácil de gerenciar do que 32x32 e 57x57) (obrigado Guiber!). Se você tiver um bom motivo para variar o tamanho da geometria do bloco, faça o que for necessário.

drxzcl
fonte
2
Também é mais fácil remover / ocultar as costuras entre dois pedaços de tamanhos diferentes, se uma resolução é múltipla da outra, porque eles compartilham mais vértices. (por exemplo: 32x32 e 64x64 é mais fácil de gerenciar do que 32x32 e 57x57)
Alayric 12/12/12
Resposta brilhante, esclareceu muitas coisas. Particularmente, grande parte da implementação se deve a considerar os recursos do mecanismo. Com o 3a , ainda não tenho certeza de quando disparar uma consulta à distância, as duas implementações que considero pesadas na CPU, farei mais algumas pesquisas sobre isso. Obrigado
Caius Eugene
Guiber, você está certo! Estou roubando isso: P
drxzcl 13/12/12
1
@CaiusEugene: Eu acho que você está pensando demais na sua determinação de distância. Eu adicionei um algoritmo muito barato e muito básico à resposta no ponto 3a que deve ajudá-lo a começar.
Drxzcl