Skip to content

Construindo um mundo aberto no navegador, parte 6: Clipmaps mudaram o rumo da história

Por Oleg Sidorkin, Diretor de Tecnologia e Cofundador da Cinevva

Chegou agora? Consulte o guia da série. Ele explica o que é um spike e reúne links para todas as partes.

Antes do Spike 10, nosso modelo mental ainda era: "um mundo maior significa mais geometria". Depois do Spike 10, o modelo passou a ser: "orçamento constante de geometria, com atualizações de anéis centralizados na câmera". Essa mudança alterou a trajetória do projeto.

A ideia por trás dos clipmaps de geometria é simples. O terreno é renderizado como um conjunto de anéis concêntricos centralizados na câmera. O anel mais interno tem a maior densidade de vértices. Cada anel k em direção ao exterior dobra o espaçamento entre vértices, sk=s02k, cobrindo assim uma área de terreno 4× maior que a do anel imediatamente anterior.

Essa duplicação é todo o segredo. A distância de visão cresce geometricamente com o número de anéis, dviews02L, enquanto o custo de vértices cresce apenas linearmente:

VtotalN2L

para L anéis com N×N vértices cada. Dobrar a distância de visão custa apenas mais um anel, não quatro vezes mais geometria. A contagem de triângulos permanece praticamente constante, independentemente do tamanho do mundo, porque você sempre renderiza os mesmos L anéis com a mesma resolução.

Abrir o Spike 10 em uma nova aba ↗ · Ver código-fonte

O truque prático foi usar geomorfização nos limites dos anéis. Quando um vértice passa de um anel de LOD para o seguinte, sua altura precisa fazer uma transição suave entre a amostra de alta resolução e a de baixa resolução. Sem isso, surgem saltos visíveis sempre que a câmera se move e os anéis se deslocam. Resolvemos isso com um fator de mistura baseado na distância do vértice até a borda do anel, interpolando a altura no shader de vértice:

h=lerp(hfine,hcoarse,α),α=smoothstep(dnear,dfar,d)

onde d é a distância do vértice em relação à câmera. Dentro do anel (ddnear), o vértice usa sua altura em resolução máxima; quando alcança o anel seguinte (ddfar), ele já migrou para a altura de baixa resolução que esse anel usará, portanto não resta nenhum salto a ocorrer.

Uma lição sutil veio dos testes de movimentação da câmera. É fácil avaliar clipmaps em capturas de tela estáticas e não perceber artefatos de transição. Passamos bastante tempo percorrendo os limites dos anéis em velocidade constante e observando a presença de ruído temporal. As capturas de tela mentiam. O movimento revelava a verdade.

Esse spike também nos proporcionou uma separação arquitetural bem definida. Com o tempo, o terreno próximo poderia se tornar dinâmico e caro, com edição volumétrica, materiais mais complexos e interação com a física. O terreno distante poderia permanecer estável, previsível e barato. Essa separação se tornou a espinha dorsal de todas as decisões arquiteturais tomadas dali em diante.

Se você está avaliando clipmaps para seu próprio projeto, teste ciclos de estresse, não imagens bonitas. Percursos longos, mudanças na altitude da câmera e travessias repetidas dos limites são o que expõe os problemas reais.

Na parte 7, adicionamos geração volumétrica de malhas e passamos de "terreno como superfície" para "terreno como volume editável". Foi nesse ponto que o projeto deixou de ser apenas um renderizador e começou a se tornar um editor de mundos.

Tecnologias mencionadas neste capítulo

Clipmaps de geometria. Apresentados por Losasso e Hoppe na SIGGRAPH 2004 (artigo), os clipmaps de geometria renderizam o terreno como anéis quadrados concêntricos centralizados na câmera. Cada anel tem o dobro da área do anterior, com metade da resolução de vértices. A contagem total de vértices é constante: aproximadamente N2L. Com N=256 e L=8 níveis, isso representa 2562×8524,000 vértices, independentemente do tamanho do mundo. A CPU atualiza os dados do mapa de alturas de cada anel conforme a câmera se move. O shader de vértice lê a altura de uma textura e desloca a grade plana. Consulte nosso guia de paisagens sobre clipmaps de geometria e o GPU Gems 2, Capítulo 2.

Geomorfização. O maior artefato visual no LOD de terrenos é o surgimento de saltos: os vértices mudam de posição repentinamente quando um trecho troca de nível de LOD. A geomorfização elimina esse problema ao mesclar as posições dos vértices entre os níveis de LOD ao longo de uma zona de transição. Cada vértice armazena tanto sua altura no LOD atual quanto sua altura no LOD de menor resolução. Um fator de transformação baseado na distância da câmera interpola suavemente entre elas: morphedHeight = mix(fineLodHeight, coarseLodHeight, smoothstep(lodNear, lodFar, distance)). A zona de transição normalmente corresponde aos 20% externos de cada anel. Em velocidades normais da câmera, a transição é invisível. Consulte os detalhes sobre geomorfização.

CDLOD (clipmaps adaptativos por quadtree). Uma evolução dos clipmaps de anéis fixos, proposta por Strugar (2014, artigo). Em vez de anéis concêntricos com resolução uniforme, o CDLOD usa uma quadtree que se adapta à complexidade do terreno. Áreas planas usam nós de baixa resolução, enquanto áreas com muitos detalhes, como penhascos e cristas, recebem subdivisões mais refinadas. Isso é importante para mundos criados por usuários, nos quais diferentes chunks podem ter níveis de complexidade muito distintos. Consulte a seção sobre CDLOD em nosso guia de paisagens.


Parte 6 de 12.
Anterior: Parte 5 — Definindo o orçamento dos elementos visuais
Próxima: Parte 7 — Marching cubes e as primeiras cavernas de verdade
Guia da série: /pt-BR/blog/2026-02-25-open-world-browser-series-guide