Ambientes destrutíveis são um dos problemas mais difíceis da renderização em jogos. Uma malha tradicional precisa ser retriangulada sempre que a superfície muda, o que é caro e cria contagens de triângulos imprevisíveis. SDFs lidam com destruição naturalmente porque esculpir um buraco é apenas uma subtração CSG, uma operação sobre um campo escalar. Este artigo aborda a operação de escultura, como a árvore de SDF escala conforme deformações se acumulam, a etapa de extração com Marching Cubes que transforma o campo de volta em triângulos, e as abordagens híbridas que os motores usam na prática.
Para os operadores CSG e os fundamentos do sphere tracing, comece com a visão geral de Campos de Distância com Sinal . Para o contexto do motor como um todo, veja SDFs no desenvolvimento de jogos .
Esculpir Terreno Destrutível com Subtração CSG
Quando uma explosão remove um pedaço esférico de terreno, o SDF é atualizado com uma única operação:
float crateredTerrainSDF(vec3 p) {
float terrain = terrainBaseSDF(p);
float crater = sphereSDF(p, explosionCenter, explosionRadius);
return max(terrain, -crater); // CSG subtraction
}
O padrão max(a, -b) subtrai o volume B do volume A. Qualquer ponto que estava dentro do terreno e da esfera de explosão agora está fora (sua distância se torna positiva), esculpindo um buraco exatamente onde a explosão ocorreu. A atualização custa uma primitiva extra por explosão, não uma retriangulação completa.
Um exemplo trabalhado mostra a subtração agindo sobre valores reais. Considere um terreno plano onde o SDF base é o plano (negativo abaixo da superfície, positivo acima) e uma explosão centrada em com raio 3. O SDF da cratera é .
Teste três pontos:
- : terreno (1.5 unidades abaixo da superfície), cratera (dentro da explosão). Combinado: . O ponto que era chão sólido agora está 1.5 unidades fora do terreno. Ele foi esculpido.
- : terreno , cratera . Combinado: . Ainda na superfície, inalterado.
- : terreno , cratera . Combinado: . Logo fora da borda da explosão, inalterado.
O primeiro ponto é a escultura em si: chão que era sólido agora está vazio. Os outros dois mostram que o terreno intocado mantém seus valores exatos de distância, então o campo combinado permanece um SDF válido em todos os lugares, exceto onde a esfera se sobrepõe ao terreno.
Isso escala para múltiplas deformações sequenciais. Cada nova cratera adiciona mais um termo à expressão do SDF. Após 50 explosões, o SDF é uma árvore com 51 primitivas (1 terreno base + 50 operações de subtração), e avaliá-lo em um ponto custa 51 cálculos de distância de primitivas. Isso é crescimento linear no número de eventos de deformação, mas constante por avaliação, sem topologia de malha para manter. Quando muitas crateras se sobrepõem, a árvore permanece correta porque cada termo max apenas torna um ponto mais para fora, que é exatamente a semântica de remover material.
Extração de Malha para Renderização
O terreno baseado em SDF ainda precisa se tornar triângulos para o pipeline de rasterização, a menos que você renderize inteiramente com ray marching. A ponte padrão é o Marching Cubes, que extrai uma isosuperfície de um campo escalar amostrado. Como o SDF codifica a superfície como o conjunto de nível zero, o Marching Cubes extrai naturalmente uma malha triangular que aproxima a forma atual do terreno.
O pipeline completo é assim:
- Mantenha um SDF de terreno base, possivelmente amostrado de um heightmap ou ruído procedural.
- Aplique subtração CSG para cada evento de deformação (explosões, escavação, construção).
- Amostre o SDF combinado em uma grade 3D ao redor da região deformada.
- Execute Marching Cubes nessas amostras para produzir uma malha triangular.
- Envie a malha para a GPU para rasterização.
As etapas 3 a 5 se repetem a cada quadro na região afetada, mas a grade normalmente é pequena (64³ ou 128³) e a extração é rápida o suficiente para uso em tempo real. Jogos como Astroneer e Deep Rock Galactic usam variações desse pipeline para seu terreno destrutível.
Duas decisões de ajuste dominam a qualidade da extração. A primeira é a resolução da grade: dobrar a resolução multiplica a contagem de amostras por 8 em 3D, então o tamanho da grade é um orçamento direto de memória e tempo. A segunda é onde a grade vive: extrair apenas ao redor da região deformada mantém o custo limitado, independentemente do tamanho do nível, enquanto re-extrair o mundo inteiro a cada quadro não escala. As compensações de amostragem e interpolação são as mesmas que regem os campos de distância com sinal assados ; o hub de Marching Cubes aborda o algoritmo de extração em si.
Abordagens Híbridas
Nem toda superfície destrutível precisa de um SDF volumétrico completo. Um híbrido comum é representar o terreno como um heightfield 2D com um SDF 2D codificando informações de saliências e cavernas. O heightfield lida com a superfície primária a baixo custo, e o SDF lida com características côncavas e túneis que um heightfield não consegue representar.
Outro híbrido armazena o histórico de deformação como uma lista de primitivas subtraídas (esferas, caixas, cápsulas) e as avalia em tempo de execução apenas onde necessário. Longe de qualquer deformação, o terreno base avalia rapidamente. Perto das deformações, os termos CSG extras adicionam custo, mas apenas nas regiões onde o detalhe é alto. Esse é o mesmo princípio da árvore de SDF da seção de escultura, mas com a árvore mantida preguiçosa: as primitivas só são consultadas quando uma consulta cai dentro de sua região delimitadora.
O híbrido que mais aparece em jogos lançados combina todos esses: um heightfield para o terreno amplo, um pequeno volume de SDF volumétrico para a região ao redor de deformações ativas, e uma lista de eventos de deformação que pode ser reproduzida para reconstruir qualquer uma das representações quando o nível é salvo ou carregado.
Resumo
A destruição é onde os pontos fortes representacionais do SDF se alinham com mais clareza:
- Escultura é uma subtração CSG,
max(terrain, -crater), que remove exatamente o volume explodido e permanece um campo de distância válido em todos os outros lugares. - Escalonamento é linear no número de eventos de deformação e constante por avaliação, sem topologia de malha para reparar.
- Renderização re-extrai triângulos com Marching Cubes a partir de uma grade pequena ao redor da região deformada.
- Híbridos combinam heightfields, listas de deformação preguiçosas e SDFs volumétricos para manter o custo proporcional ao dano real.
O mesmo campo que armazena o terreno esculpido também responde às consultas de colisão que os jogadores disparam contra ele, e às passadas de sombra e AO que o iluminam.