Campos de Distância com Sinal: Uma Introdução Visual

EN NL ES PT-BR


Os campos de distância com sinal (SDFs, do inglês signed distance fields) respondem à pergunta mais importante em gráficos procedurais: onde está a superfície mais próxima e de que lado estou? Saber a distância até a superfície em qualquer ponto é o que faz o ray marching, as verificações de colisão e a composição de formas funcionarem com aritmética simples em vez de processamento geométrico caro. Em vez de armazenar triângulos ou segmentos de curva diretamente, você armazena uma função e a avalia onde precisar de informação. Isso torna os SDFs uma escolha natural para gráficos procedurais, onde formas são frequentemente criadas, combinadas e animadas matematicamente.

O Que um Único Número Pode Dizer

Para qualquer ponto no espaço, um SDF retorna um valor escalar com sinal d(p)d(\mathbf{p}) na posição p\mathbf{p}:

  • positivo fora da forma
  • zero na superfície
  • negativo dentro da forma

O valor absoluto d(p)|d(\mathbf{p})| é a menor distância até a borda, e o sinal indica de que lado você está. Se d(p)=0,12d(\mathbf{p}) = -0,12, o ponto está a 0,12 unidades dentro da forma. Se d(p)=0,12d(\mathbf{p}) = 0,12, ele está a 0,12 unidades fora. Em zero, você está na superfície. Um único número fornece tanto um rótulo de lado quanto uma distância.

Isso significa que um campo escalar armazena mais do que uma máscara binária. Valores negativos traçam contornos dentro da forma, zero marca a própria fronteira, e valores positivos traçam contornos fora.

Inside Surface Outside

No explorador, passe o mouse sobre o mapa de calor para inspecionar a distância com sinal em qualquer ponto. A leitura mostra o valor (negativo dentro, positivo fora) e rotula cada local como Dentro, Superfície ou Fora. O contorno zero, a própria fronteira da forma, está sempre visível como uma linha preta nítida. Use o menu suspenso para alternar entre as formas: Círculo, Caixa, Caixa Arredondada, Segmento de Linha, Cápsula e Polígono Regular; todas funcionam da mesma maneira mesmo que a geometria mude. Cada forma exibe sua fórmula SDF acima dos controles deslizantes de parâmetros, para que você conecte a matemática ao campo enquanto ajusta raio, largura ou arredondamento.

Como o SDF codifica a distância em cada ponto, você pode deslocar a superfície por um valor fixo simplesmente subtraindo uma margem. Isso cria um buffer de colisão, um rebaixo para chanfros ou uma casca expandida sem alterar a forma original. O mesmo campo que define a superfície também responde a que distância tudo o mais está, razão pela qual SDFs aparecem em pipelines de renderização, física e extração de isosuperfícies sem conversão de formato intermediário.

Fórmulas para Formas Primitivas

Toda cena SDF começa com blocos de construção simples. Cada primitiva tem uma fórmula compacta, e uma vez que você entende como algumas delas funcionam, o padrão por trás de todas as outras fica claro.

O círculo é o ponto de partida natural:

d(p)=pcrd(\mathbf{p}) = \|\mathbf{p} - \mathbf{c}\| - r

O termo pc\|\mathbf{p} - \mathbf{c}\| mede a distância euclidiana do ponto de amostra p\mathbf{p} até o centro c\mathbf{c} do círculo. Subtrair o raio rr desloca o cruzamento por zero para fora, até a borda do círculo. Quando o ponto está exatamente na borda, a distância ao centro é igual a rr e a fórmula retorna zero. Fora do círculo, a distância ao centro excede rr, então o resultado é positivo. Dentro, é menor que rr, então o resultado é negativo e sua magnitude indica o quão para dentro o ponto está.

Em código, a fórmula do círculo é uma linha:

float circleSDF(vec2 p, vec2 center, float r) {
    return length(p - center) - r;
}

A caixa se baseia na mesma ideia, mas usa lógica de distância por componentes. Para uma caixa centrada em c\mathbf{c} com meia-largura b\mathbf{b}:

q=pcbd(p)=max(q,0)+min(max(qx,qy),0)\begin{aligned} \mathbf{q} &= |\mathbf{p} - \mathbf{c}| - \mathbf{b} \\ d(\mathbf{p}) &= \|\max(\mathbf{q}, 0)\| + \min(\max(q_x, q_y), 0) \end{aligned}

O primeiro passo desloca o ponto para o quadro de coordenadas local da caixa e subtrai as meias-extensões. Se cada componente de q\mathbf{q} for negativa, o ponto está dentro da caixa. O segundo passo calcula a distância final: max(q,0)\|\max(\mathbf{q}, 0)\| dá a distância euclidiana do exterior (zero quando dentro), e min(max(qx,qy),0)\min(\max(q_x, q_y), 0) dá a profundidade de penetração do interior (zero quando fora). Somá-los produz um único valor com sinal que segue o contrato SDF em todos os lugares: positivo fora, negativo dentro, zero na superfície.

Em código:

float boxSDF(vec2 p, vec2 center, vec2 halfSize) {
    vec2 q = abs(p - center) - halfSize;
    return length(max(q, 0.0)) + min(max(q.x, q.y), 0.0);
}

Os dois termos na última linha correspondem diretamente aos casos externo e interno da explicação acima. Quando o ponto está fora, max(q.x, q.y) é positivo e o termo min é zero. Quando o ponto está dentro, max(q, 0.0) é zero e o termo min carrega a profundidade de penetração negativa.

A mesma fórmula do círculo generaliza diretamente para três dimensões: troque a distância 2D por uma distância 3D e o raio permanece o mesmo. O resultado é o campo de distância sinalizada para uma esfera , uma das poucas formas com distância exata em todos os pontos do espaço e o ponto de partida natural para construir cenas SDF mais complexas.

Para uma referência abrangente cobrindo triângulos, cápsulas, toros e muitas outras formas, veja o catálogo de funções de distância de Iñigo Quilez.

Combinando Formas com Geometria Sólida Construtiva

Uma única primitiva SDF raramente é suficiente. A maioria das cenas é construída combinando vários campos. Essa estratégia de construir formas complexas a partir de formas mais simples com operações booleanas é chamada de geometria sólida construtiva (CSG, do inglês constructive solid geometry). Com SDFs, a CSG se reduz a algumas operações de min e max sobre valores de distância, em vez dos complicados algoritmos de corte de malha que os booleanos baseados em triângulos exigem.

Os operadores CSG padrão para SDFs são:

  • união: min(a, b)
  • interseção: max(a, b)
  • subtração (A menos B): max(a, -b)

O caso da união é o ponto de partida mais importante. Em qualquer ponto amostrado, a superfície mais próxima controla o valor do campo combinado, então a distância mínima é o resultado correto. No modo de subtração max(dA, -dB), os pontos dentro de B invertem o sinal e esculpem espaço dentro de A. É assim que furos, recortes e formas de espaço negativo são construídos na modelagem construtiva com SDFs. É também assim que funciona o terreno destrutível em tempo real: esculpir uma cratera é uma única subtração, e cada deformação apenas adiciona mais um termo à árvore CSG.

0.50
0 primitives
Inside Outside

A visualização começa no modo Subtração: o anel esculpe um furo arredondado na caixa. O mapa de cores mostra o campo de distância com sinal por todo o espaço: azul para fora, vermelho para dentro, com um contorno brilhante na superfície zero. Mude para União para ver as duas formas se fundirem ao longo de suas bordas mais próximas, depois para Interseção para ver apenas a região de sobreposição preservada. A leitura ao passar o mouse mostra a distância com sinal exata em qualquer ponto, reforçando que cada operação é simplesmente a avaliação de uma expressão matemática sobre os dois campos. Adicione mais primitivas com os botões de paleta e arraste-as para posições de sobreposição para ver como campos mais complexos se compõem.

Mistura Suave

Os operadores min e max puros produzem bordas CSG nítidas. Para muitos estilos visuais, isso é exatamente o que se deseja. Para transições orgânicas, variantes suaves são comuns. Uma opção popular é o mínimo suave (smooth minimum, smin) com parâmetro kk:

h=clamp(0.5+0.5bak,0,1),smin(a,b,k)=mix(b,a,h)kh(1h)h = \mathrm{clamp}\left(0.5 + 0.5\frac{b-a}{k}, 0, 1\right), \quad \mathrm{smin}(a,b,k) = \mathrm{mix}(b,a,h) - k h(1-h)

Conforme kk aumenta, a região de mistura se alarga. Conforme k0k \to 0, o comportamento se aproxima do min puro. A mesma ideia se estende a variantes de subtração suave e interseção suave.

0.50
0 primitives
Inside Outside

Aqui a operação está definida como União Suave desde o início. As duas formas se sobrepõem com uma borda suavizada onde se encontram. Arraste o controle deslizante de mistura para cima para alargar a região de fusão, ou volte para União para comparar a junção nítida lado a lado com a versão suave. A leitura ao passar o mouse mostra como o valor de distância combinado muda conforme o parâmetro kk suaviza a transição.

Esta é a principal razão pela qual o código de cena com SDFs permanece compacto. Um grafo de cena inteiro pode ser condensado em uma única função que retorna um escalar. Você pode avaliar essa mesma função para renderização, verificação de colisão, mascaramento e efeitos.

A composição suave é poderosa, mas altera a curvatura local e, às vezes, a qualidade do campo. Se seu pipeline depende de garantias estritas de distância para longos passos de ray marching, a suavização agressiva pode exigir limites mais apertados ou lógica de passo mais conservadora.

Transformações de Domínio e Repetição

Outra grande vantagem dos SDFs é a transformação de domínio. Em vez de modificar a própria função da forma, você transforma as coordenadas de entrada antes da avaliação:

  1. Translação: avalie em pt\mathbf{p} - \mathbf{t}
  2. Rotação: avalie em R1pR^{-1}\mathbf{p}, onde R1R^{-1} é a inversa da matriz de rotação (aplicando a rotação oposta ao ponto de entrada)
  3. Escala: avalie em p/s\mathbf{p}/s e reescalone a distância por ss
  4. Repetição: dobre as coordenadas com mod ou fract para repetir uma forma em uma grade

Essas transformações permitem que uma única definição de primitiva crie muitas instâncias. Por exemplo, um único SDF de círculo pode se tornar uma grade de círculos por meio de uma operação mod que ladrilha as coordenadas no espaço. Esta é uma das razões pelas quais SDFs são comuns em cenas procedurais baseadas em shaders, onde definições concisas de cena são importantes.

As operações de domínio também se combinam naturalmente com modulação por ruído. Você pode usar ruído de valor, Perlin e fractal para perturbar coordenadas ou distâncias, criando superfícies rochosas, fundidas ou nubladas, mantendo um fluxo de trabalho funcional de modelagem.

Campos Assados: Amostragem de Geometria em uma Grade

Nem toda forma chega como uma fórmula organizada. Glifos de fontes, terreno destrutível, modelos digitalizados e malhas poligonais criadas por artistas precisam de SDFs, mas não têm expressões de forma fechada. Para geometrias assim, o campo precisa ser calculado e armazenado em vez de derivado analiticamente.

O processo é chamado de assamento (baking): pré-calcular distâncias com sinal em cada ponto de uma grade regular, salvar as amostras e interpolar entre elas para responder a consultas futuras. Ele troca tempo de computação por consulta por computar-uma-vez-ler-muitas, e distância exata por distância aproximada.

Inside Outside Surface

Pressione play para acompanhar a avaliação célula por célula: cada ponto da grade encontra sua borda poligonal mais próxima e registra uma distância com sinal. A sobreposição de cores mostra a interpolação bilinear reconstruindo o campo a partir dessas amostras discretas. Em baixa resolução, o contorno zero se desvia visivelmente das bordas reais e os cantos se arredondam. Aumentar a resolução reduz o erro, mas dobrá-la custa 4× mais amostras em 2D e 8× em 3D.

Uma vez assado, as mesmas técnicas posteriores ainda se aplicam. Operações CSG, normais de superfície e ray marching consomem os mesmos valores escalares, independentemente de uma fórmula ou uma grade tê-los produzido, embora campos interpolados precisem de margens de segurança maiores porque não preservam a garantia de distância exata. Para uma análise mais aprofundada sobre escolhas de resolução, artefatos de interpolação, amostragem adaptativa e aplicações de produção como a renderização de texto SDF da Valve e os campos de distância de malha da Unreal Engine 5, veja o artigo campos de distância com sinal assados .

Normais de Superfície a Partir do Gradiente do SDF

Quando um ray marcher ou outra consulta encontra um ponto na superfície, a próxima pergunta geralmente é para qual direção essa superfície está voltada. As normais de superfície são essenciais para iluminação, reflexões e resposta a colisões: elas indicam como a luz reflete na superfície e para que lado os objetos devem deslizar ao tocar.

Um SDF pode responder a isso sem armazenar um buffer de normais separado. Como o campo codifica a distância em cada ponto, a direção na qual a distância aumenta mais rapidamente sempre aponta para longe da superfície mais próxima. Perto da borda, essa direção é a normal da superfície voltada para fora. Matematicamente, o gradiente d(p)\nabla d(\mathbf{p}) fornece essa direção.

Gradient arrow Surface normal

A visualização sobrepõe setas de gradiente no mapa de calor do SDF. Cada seta aponta na direção de f\nabla f em sua localização de amostragem, e o padrão é imediatamente visível: todas as setas irradiam para fora a partir da superfície mais próxima, independentemente da forma. Passe o mouse em qualquer lugar sobre o campo e uma sonda aparece com a distância com sinal, a direção do gradiente e a magnitude do gradiente nesse ponto exato. A leitura rotula a seta como normal de superfície sempre que o cursor está próximo ao contorno zero, tornando explícita a relação entre gradiente e normal. Clique para fixar a sonda no lugar e então alterne entre círculo, caixa, caixa arredondada, segmento de linha e uma união composta de dois círculos para confirmar que as normais emergem da estrutura do campo da mesma forma em todas as formas.

Observe que a magnitude do gradiente permanece em ou próximo de 1 em todo o campo. Esta é a propriedade eikonal (f=1|\nabla f| = 1) que torna os SDFs exatos especiais: a direção do gradiente já é um vetor unitário. Quando a sonda está sobre a isosuperfície zero, a seta fica exatamente perpendicular à borda da superfície. Essa direção perpendicular é a normal de superfície, e como a magnitude do gradiente é 1, nenhum passo de normalização separado é necessário além da divisão pela constante de diferenças finitas.

Na prática, os gradientes são estimados numericamente usando diferenças finitas, o que significa amostrar o SDF em pontos ligeiramente deslocados em cada eixo e medir o quanto a distância muda:

d(p)[d(p+εx)d(pεx)d(p+εy)d(pεy)]\nabla d(\mathbf{p}) \approx \begin{bmatrix} d(\mathbf{p}+\varepsilon_x)-d(\mathbf{p}-\varepsilon_x) \\ d(\mathbf{p}+\varepsilon_y)-d(\mathbf{p}-\varepsilon_y) \end{bmatrix}

Os pontos laranjas ao redor da sonda mostram exatamente esses pontos de amostragem: dois ao longo do eixo x em ±ε\pm\varepsilon e dois ao longo do eixo y, cada um rotulado com o valor de distância amostrado ali. Arraste o controle deslizante de ε\varepsilon para ver a relação de compromisso. Com ε\varepsilon muito pequeno (0,001), os pontos do estêncil ficam agrupados próximos à sonda e o gradiente pode se tornar ruidoso. Com ε\varepsilon maior (0,5), o estêncil se espalha e o gradiente se suaviza, mas pode se desalinhar da normal de superfície verdadeira perto de cantos fechados ou regiões de alta curvatura. O valor padrão ε=0,01\varepsilon = 0,01 equilibra precisão e estabilidade para a maioria dos SDFs analíticos.

Depois de calcular ambos os componentes, normalize o vetor resultante antes de usá-lo em cálculos de iluminação. Isso é central na renderização de campos porque não existe um buffer de normais de malha explícito para consultar. O mesmo SDF que localiza a superfície também estima sua orientação para iluminação difusa e especular, reflexões ou efeitos de ambiente.

Qualidade do Campo e Garantias de Distância

Nem todo campo de distância com sinal é um campo de distância exato. Um SDF derivado de uma fórmula (como os exemplos do círculo ou da caixa vistos anteriormente) retorna a verdadeira distância euclidiana até a superfície mais próxima. Um campo assado a partir de uma malha, uma mistura CSG suavizada ou um estimador de distância de uma função de ruído pode retornar um valor que tem sinal e é aproximadamente uma distância, mas não é um limite superior estrito para o quão longe um raio pode avançar com segurança.

A distinção é importante porque as técnicas posteriores dependem da força da garantia de distância. O sphere tracing e o sphere casting são comprovadamente seguros apenas quando o campo nunca superestima a distância. Se um campo subestima a distância (retorna 0,2 quando a distância real é 0,5), o marcher dá passos menores que o necessário, mas ainda converge. Se superestima (retorna 0,5 quando a distância real é 0,2), o marcher pode atravessar uma parede fina ou uma característica estreita completamente.

Na prática, SDFs analíticos exatos são preferíveis quando as margens de segurança são importantes, como em detecção de colisão ou longos raios de câmera. Misturas CSG suavizadas, grades assadas e superfícies moduladas por ruído relaxam a garantia de distância exata em graus variados. O artigo sobre ray marching aborda como gerenciar a segurança dos passos, limites de épsilon e limites de iterações ao trabalhar com estimadores de distância menos rigorosos.

Onde os SDFs se Encaixam em um Pipeline de Renderização

SDFs são melhor vistos como uma opção de representação geométrica, não como um substituto universal para malhas. Eles são excelentes quando as formas são procedurais, deformáveis ou com muita composição. Malhas continuam sendo a melhor escolha quando você precisa de topologia criada por artistas, fluxos de UV e aceleração direta por hardware de triângulos.

Um pipeline híbrido prático geralmente funciona assim: rasterize a geometria principal da cena (personagens, edifícios, terreno) como triângulos, depois use SDFs para efeitos específicos que se beneficiam de consultas de distância. Por exemplo:

  • Sombras suaves e oclusão de ambiente podem ser computadas avaliando um SDF do ambiente estático como um pós-processo ou durante a iluminação, mesmo que as superfícies visíveis tenham sido rasterizadas.
  • Decalques e detalhes procedurais (marcas de queimadura, buracos de bala, poças) podem ser projetados em superfícies rasterizadas avaliando um SDF para determinar posicionamento e mesclagem.
  • Efeitos volumétricos como névoa, fumaça e feixes de luz usam campos de distância para descobrir o quão longe um raio pode viajar pelo espaço vazio antes de atingir uma superfície, independentemente de essa superfície ter sido rasterizada ou percorrida por ray marching.
  • Consultas de colisão e física contra geometria de nível estática usam uma grade SDF assada, enquanto os objetos dinâmicos que a consultam são malhas de corpo rígido padrão. A mesma representação de campo que guia a renderização também responde consultas de profundidade de penetração, direção de separação e colisão contínua, com aplicações que se estendem a pathfinding de IA e sombras suaves em tempo real. Para uma visão geral de como essas técnicas se encaixam em um motor de jogos, veja campos de distância sinalizada no desenvolvimento de jogos .

O insight principal é que a avaliação de SDF e a rasterização de triângulos operam em passos separados que se alimentam mutuamente. Você pode rasterizar um personagem com hardware GPU tradicional e depois amostrar um campo de distância no shader de fragmento para adicionar auto-sombreamento suave do ambiente. Você pode renderizar um sistema de partículas como quads voltados para a tela e depois usar um SDF no shader de vértice para repelir partículas de superfícies procedurais. As representações coexistem porque respondem a perguntas diferentes: triângulos respondem “de que cor é este pixel?” e SDFs respondem “a que distância está a superfície mais próxima deste ponto?”

Se você quiser o contexto completo de travessia, o artigo sobre ray marching com campos de distância com sinal cobre a busca iterativa por interseção em detalhes. Para contexto de GPU em nível de estágio, o artigo sobre shaders de vértice e fragmento no pipeline gráfico é um bom background.

Resumo

Campos de distância com sinal codificam formas como uma função escalar com duas garantias sólidas: magnitude da distância e sinal de dentro/fora. A partir dessa única representação, você pode:

  1. percorrer raios com passos seguros guiados pela distância
  2. compor cenas com operadores min e max
  3. estimar normais a partir de gradientes por diferenças finitas
  4. aplicar transformações de domínio para construir layouts procedurais complexos

Essa combinação de modelagem compacta e lógica de avaliação reutilizável é a razão pela qual os SDFs continuam sendo uma ferramenta central em gráficos procedurais. Uma vez que o contrato do campo está claro, muitas técnicas que parecem avançadas se tornam variações do mesmo ciclo: avalie a distância, mova-se ou sombreie usando esse resultado, repita.