Campos de Distancia con Signo: Una Introducción Visual

EN NL ES PT-BR


Los campos de distancia con signo (SDF, por sus siglas en inglés) responden la pregunta más importante en gráficos procedurales: ¿dónde está la superficie más cercana y de qué lado estoy? Saber la distancia a la superficie en cualquier punto es lo que hace que el ray marching, las comprobaciones de colisión y la composición de formas funcionen con aritmética simple en lugar de costoso procesamiento geométrico. En lugar de almacenar triángulos o segmentos de curva directamente, se almacena una función y se evalúa donde sea necesario. Esto hace que los SDF sean una opción natural para gráficos procedurales, donde las formas suelen crearse, combinarse y animarse matemáticamente.

Lo Que un Solo Número Puede Decirte

Para cualquier punto en el espacio, un SDF devuelve un valor escalar con signo d(p)d(\mathbf{p}) en la posición p\mathbf{p}:

  • positivo fuera de la forma
  • cero en la superficie
  • negativo dentro de la forma

El valor absoluto d(p)|d(\mathbf{p})| es la distancia más corta al límite y el signo indica de qué lado te encuentras. Si d(p)=0.12d(\mathbf{p}) = -0.12, el punto está a 0.12 unidades dentro de la forma. Si d(p)=0.12d(\mathbf{p}) = 0.12, está a 0.12 unidades fuera. En cero, estás en la superficie. Un solo número te da tanto una etiqueta de lado como una distancia.

Eso significa que un campo escalar almacena más que una máscara binaria. Los valores negativos trazan contornos dentro de la forma, el cero marca el límite mismo, y los valores positivos trazan contornos fuera.

Inside Surface Outside

En el explorador, pasa el ratón sobre el mapa de calor para inspeccionar la distancia con signo en cualquier punto. La lectura muestra el valor (negativo dentro, positivo fuera) y etiqueta cada ubicación como Interior, Superficie o Exterior. El contorno cero, el propio límite de la forma, siempre es visible como una línea negra nítida. Usa el menú desplegable para cambiar entre formas: Círculo, Caja, Caja Redondeada, Segmento de Línea, Cápsula y Polígono Regular; todas funcionan de la misma manera aunque la geometría cambie. Cada forma muestra su fórmula SDF sobre los controles deslizantes, para que puedas conectar las matemáticas con el campo mientras ajustas el radio, el ancho o el redondeo.

Debido a que el SDF codifica la distancia en cada punto, puedes desplazar la superficie una cantidad fija simplemente restando un valor de margen. Esto crea un búfer de colisión, un rebaje para biseles o una cáscara expandida sin cambiar la forma original. El mismo campo que define la superficie también responde qué tan lejos está todo lo demás, razón por la cual los SDF aparecen en pipelines de renderizado, física y extracción de isosuperficies sin conversión de formato intermedio.

Fórmulas para Formas Primitivas

Toda escena SDF comienza con bloques de construcción simples. Cada primitiva tiene una fórmula compacta, y una vez que entiendes cómo funcionan unas cuantas, el patrón detrás de todas las demás se vuelve claro.

El círculo es el punto de partida natural:

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

El término pc\|\mathbf{p} - \mathbf{c}\| mide la distancia euclidiana desde el punto de muestra p\mathbf{p} hasta el centro del círculo c\mathbf{c}. Restar el radio rr desplaza el cruce por cero hacia afuera, hasta el límite del círculo. Cuando el punto está exactamente en el límite, la distancia al centro es igual a rr y la fórmula devuelve cero. Fuera del círculo, la distancia al centro supera rr, por lo que el resultado es positivo. Dentro, es menor que rr, por lo que el resultado es negativo y su magnitud indica qué tan adentro está el punto.

En código, la fórmula del círculo es una línea:

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

La caja se basa en la misma idea pero usa lógica de distancia por componentes. Para una caja centrada en c\mathbf{c} con mitad de tamaño 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}

El primer paso desplaza el punto al marco de coordenadas local de la caja y resta las semiextensiones. Si cada componente de q\mathbf{q} es negativo, el punto está dentro de la caja. El segundo paso calcula la distancia final: max(q,0)\|\max(\mathbf{q}, 0)\| da la distancia euclidiana desde el exterior (cero cuando está dentro), y min(max(qx,qy),0)\min(\max(q_x, q_y), 0) da la profundidad de penetración desde el interior (cero cuando está fuera). Sumarlos produce un único valor con signo que sigue el contrato SDF en todas partes: positivo fuera, negativo dentro, cero en la superficie.

En 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);
}

Los dos términos en la última línea corresponden directamente a los casos exterior e interior de la explicación anterior. Cuando el punto está fuera, max(q.x, q.y) es positivo y el término min es cero. Cuando el punto está dentro, max(q, 0.0) es cero y el término min porta la profundidad de penetración negativa.

La misma fórmula del círculo se generaliza directamente a tres dimensiones: cambia la longitud 2D por una longitud 3D y el radio permanece igual. El resultado es el campo de distancia con signo para una esfera , una de las pocas formas con una distancia exacta en todos los puntos del espacio y el punto de partida natural para construir escenas SDF más complejas.

Para una referencia completa que cubre triángulos, cápsulas, toros y muchas otras formas, consulta el catálogo de funciones de distancia de Iñigo Quilez.

Combinando Formas con Geometría Sólida Constructiva

Una sola primitiva SDF rara vez es suficiente. La mayoría de las escenas se construyen combinando varios campos. Esta estrategia de construir formas complejas a partir de otras más simples con operaciones similares a las booleanas se denomina geometría sólida constructiva (CSG). Con los SDF, la CSG es solo cuestión de unas pocas operaciones min y max sobre los valores de distancia, en lugar de los complicados algoritmos de corte de mallas que requieren las booleanas basadas en triángulos.

Los operadores CSG estándar para SDF son:

  • unión: min(a, b)
  • intersección: max(a, b)
  • diferencia (A menos B): max(a, -b)

La unión es el punto de partida más importante. En cualquier punto de muestra, la superficie más cercana controla el valor del campo combinado, por lo que la distancia mínima es el resultado correcto. En el modo de diferencia max(dA, -dB), los puntos dentro de B invierten su signo y tallan espacio dentro de A. Así es como se construyen agujeros, recortes y formas de espacio negativo en el modelado SDF constructivo. También es así como funciona el terreno destructible en tiempo real: tallar un cráter es una sola resta, y cada deformación añade un término más al árbol CSG.

0.50
0 primitives
Inside Outside

La visualización comienza en modo Diferencia: el anillo talla un agujero redondeado en la caja. El mapa de colores muestra el campo de distancia con signo en todo el espacio: azul fuera, rojo dentro, con un contorno brillante en la superficie cero. Cambia a Unión para ver las dos formas fusionarse a lo largo de sus bordes más cercanos, luego a Intersección para ver solo la región superpuesta conservada. La lectura al pasar el ratón muestra la distancia con signo exacta en cualquier punto, reforzando que cada operación consiste simplemente en evaluar una expresión matemática sobre los dos campos. Añade más primitivas con los botones de la paleta y arrástralas a posiciones superpuestas para ver cómo se componen campos más complejos.

Mezcla Suave

Los min y max directos producen límites CSG nítidos. Para muchos estilos visuales eso es lo que se desea. Para transiciones orgánicas, son comunes las variantes suaves. Una opción popular es el mínimo suave (smin) con 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)

A medida que kk aumenta, la región de mezcla se ensancha. Cuando k0k \to 0, el comportamiento se aproxima al min directo. La misma idea se extiende a variantes de diferencia suave e intersección suave.

0.50
0 primitives
Inside Outside

Aquí la operación está configurada como Unión Suave desde el inicio. Las dos formas se superponen con un límite suavizado donde se encuentran. Arrastra el control deslizante de mezcla hacia arriba para ensanchar la región de fusión, o cambia de nuevo a Unión para comparar la unión nítida junto a la versión suave. La lectura al pasar el ratón muestra cómo cambia el valor de distancia combinado a medida que el parámetro kk suaviza la transición.

Esta es la razón principal por la que el código de escenas SDF se mantiene compacto. Todo un grafo de escena puede colapsar en una función que devuelve un único escalar. Puedes evaluar esa misma función para renderizado, comprobaciones de colisión, enmascaramiento y efectos.

La composición suave es poderosa, pero cambia la curvatura local y, en ocasiones, la calidad del campo. Si tu pipeline depende de garantías estrictas de distancia para pasos de rayos largos, un suavizado agresivo puede requerir umbrales más ajustados o una lógica de paso más conservadora.

Transformaciones de Dominio y Repetición

Otra gran fortaleza de los SDF es la transformación de dominio. En lugar de modificar la función de forma en sí, se transforman las coordenadas de entrada antes de evaluar:

  1. Traslación: evaluar en pt\mathbf{p} - \mathbf{t}
  2. Rotación: evaluar en R1pR^{-1}\mathbf{p}, donde R1R^{-1} es la inversa de la matriz de rotación (aplicando la rotación opuesta al punto de entrada)
  3. Escala: evaluar en p/s\mathbf{p}/s y reescalar la distancia por ss
  4. Repetición: plegar coordenadas con mod o fract para distribuir una forma en una rejilla

Estas transformaciones permiten que una única definición de primitiva cree muchas instancias. Por ejemplo, un solo SDF de círculo puede convertirse en una rejilla de círculos alimentando las coordenadas de entrada a través de una operación mod que las tesela a lo largo del espacio. Esta es una razón por la que los SDF son comunes en escenas procedurales basadas en shaders, donde las definiciones concisas de escena son importantes.

Las operaciones de dominio también se combinan naturalmente con la modulación de ruido. Puedes usar ruido de valor, Perlin y ruido fractal para perturbar coordenadas o distancias y lograr superficies rocosas, fundidas o nubosas, manteniendo un flujo de trabajo de modelado basado en funciones.

Campos Horneados: Muestreo de Geometría en una Rejilla

No todas las formas llegan como una fórmula ordenada. Los glifos de fuentes, el terreno destruible, los modelos escaneados y las mallas de polígonos creadas por artistas necesitan SDF pero carecen de expresiones analíticas. Para geometrías como esas, el campo debe calcularse y almacenarse en lugar de derivarse analíticamente.

El proceso se llama horneado (baking): precomputar distancias con signo en cada punto de una rejilla regular, guardar las muestras e interpolar entre ellas para responder consultas futuras. Intercambia tiempo de cómputo por consulta por una sola vez de cómputo con muchas lecturas, y distancia exacta por distancia aproximada.

Inside Outside Surface

Presiona play para ver la evaluación por celda: cada punto de la rejilla encuentra su borde poligonal más cercano y registra una distancia con signo. La superposición de colores muestra la interpolación bilineal reconstruyendo el campo a partir de esas muestras discretas. A baja resolución, el contorno cero se desvía visiblemente de los bordes reales y las esquinas se redondean. Aumentar la resolución reduce el error, pero duplicarla cuesta 4× más muestras en 2D y 8× en 3D.

Una vez horneado, las mismas técnicas posteriores siguen aplicándose. Las operaciones CSG, las normales de superficie y el ray marching consumen los mismos valores escalares, ya sea que los produzca una fórmula o una rejilla, aunque los campos interpolados necesitan márgenes de seguridad más amplios porque no conservan la garantía de distancia exacta. Para un análisis más profundo sobre opciones de resolución, artefactos de interpolación, muestreo adaptativo y aplicaciones de producción como el renderizado de texto SDF de Valve y los campos de distancia de malla de Unreal Engine 5, consulta el artículo campos de distancia con signo horneados .

Normales de Superficie a partir del Gradiente del SDF

Una vez que un ray marcher u otra consulta encuentra un punto en la superficie, la siguiente pregunta suele ser en qué dirección mira esa superficie. Las normales de superficie son esenciales para la iluminación, los reflejos y la respuesta a colisiones: indican cómo rebota la luz en la superficie y hacia dónde deben deslizarse los objetos al tocarla.

Un SDF puede responder esto sin almacenar un búfer de normales separado. Debido a que el campo codifica la distancia en cada punto, la dirección en la que la distancia aumenta más rápidamente siempre apunta en dirección opuesta a la superficie más cercana. Cerca del límite, esa dirección es la normal de superficie hacia afuera. Matemáticamente, el gradiente d(p)\nabla d(\mathbf{p}) da esta dirección.

Gradient arrow Surface normal

La visualización superpone flechas de gradiente sobre el mapa de calor del SDF. Cada flecha apunta en la dirección de f\nabla f en su ubicación de muestreo, y el patrón se aprecia de inmediato: todas las flechas irradian hacia afuera desde la superficie más cercana, sin importar la forma. Pasa el ratón sobre cualquier parte del campo y aparecerá una sonda con la distancia con signo, la dirección del gradiente y la magnitud del gradiente en ese punto exacto. La lectura etiqueta la flecha como normal de superficie cuando el cursor está cerca del contorno cero, haciendo explícita la relación entre gradiente y normal. Haz clic para fijar la sonda en su lugar, luego cambia entre círculo, caja, caja redondeada, segmento de línea y una unión compuesta de dos círculos para confirmar que las normales emergen de la estructura del campo de la misma manera en cada forma.

Observa que la magnitud del gradiente se mantiene en o cerca de 1 en todo el campo. Esta es la propiedad eikonal (f=1|\nabla f| = 1) que hace especiales a los SDF exactos: la dirección del gradiente ya es un vector unitario. Cuando la sonda se sitúa sobre la isosuperficie cero, la flecha queda exactamente perpendicular al límite de la superficie. Esa dirección perpendicular es la normal de superficie, y como la magnitud del gradiente es 1, no se necesita un paso de normalización separado más allá de dividir por la constante de diferencias finitas.

En la práctica, los gradientes se estiman numéricamente usando diferencias finitas, lo que significa muestrear el SDF en puntos ligeramente desplazados en cada eje y medir cuánto cambia la distancia:

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}

Los puntos naranjas alrededor de la sonda muestran exactamente estos puntos de muestreo: dos a lo largo del eje x en ±ε\pm\varepsilon y dos a lo largo del eje y, cada uno etiquetado con el valor de distancia muestreado allí. Arrastra el control deslizante de ε\varepsilon para ver el equilibrio. Con un ε\varepsilon muy pequeño (0.001), los puntos del esténcil se agrupan cerca de la sonda y el gradiente puede volverse ruidoso. Con un ε\varepsilon más grande (0.5), el esténcil se extiende ampliamente y el gradiente se suaviza, pero puede desalinearse de la normal real de la superficie cerca de esquinas cerradas o regiones de alta curvatura. El valor predeterminado ε=0.01\varepsilon = 0.01 equilibra precisión y estabilidad para la mayoría de los SDF analíticos.

Después de calcular ambos componentes, normaliza el vector resultante antes de usarlo en los cálculos de iluminación. Este proceso es central en el renderizado de campos porque no existe un búfer de normales de malla explícito al que consultar. El mismo SDF que localiza la superficie también estima su orientación para la iluminación difusa y especular, los reflejos o los efectos de ambiente.

Calidad del Campo y Garantías de Distancia

No todos los campos de distancia con signo son campos de distancia exactos. Un SDF derivado de una fórmula (como los ejemplos del círculo o la caja) devuelve la verdadera distancia euclidiana a la superficie más cercana. Un campo horneado a partir de una malla, una mezcla CSG suavizada o un estimador de distancia proveniente de una función de ruido puede devolver un valor que tiene signo y se parece a una distancia, pero que no es una cota superior estricta de cuánto puede avanzar un rayo de forma segura.

La distinción importa porque las técnicas posteriores dependen de la solidez de la garantía de distancia. El sphere tracing y el sphere casting son demostrablemente seguros solo cuando el campo nunca sobreestima la distancia. Si un campo subestima la distancia (devuelve 0.2 cuando la distancia real es 0.5), el marcher da pasos más pequeños de lo necesario pero aún converge. Si la sobreestima (devuelve 0.5 cuando la distancia real es 0.2), el marcher puede atravesar una pared delgada o una característica estrecha por completo.

En la práctica, se prefieren los SDF analíticos exactos cuando los márgenes de seguridad importan, como en la detección de colisiones o los rayos largos de cámara. Las mezclas CSG suavizadas, las rejillas horneadas y las superficies moduladas con ruido relajan la garantía de distancia exacta en diversos grados. El artículo sobre ray marching cubre cómo gestionar la seguridad de los pasos, los umbrales epsilon y los límites de pasos al trabajar con estimadores de distancia menos estrictos.

Dónde Encajan los SDF en un Pipeline de Renderizado

Los SDF se consideran mejor como una opción de representación geométrica, no como un reemplazo universal de las mallas. Son excelentes cuando las formas son procedurales, deformables o con mucha composición. Las mallas siguen siendo sólidas cuando se necesita topología creada por artistas, flujos de trabajo de UV y aceleración directa de triángulos por hardware.

Un pipeline híbrido práctico suele funcionar así: rasterizar la geometría principal de la escena (personajes, edificios, terreno) como triángulos, y luego usar SDF para efectos específicos que se benefician de las consultas de distancia. Por ejemplo:

  • Sombras suaves y oclusión ambiental pueden calcularse evaluando un SDF del entorno estático como posproceso o durante la iluminación, aunque las superficies visibles se hayan rasterizado.
  • Calcomanías y detalles procedurales (marcas de quemaduras, agujeros de bala, charcos) pueden proyectarse sobre superficies rasterizadas evaluando un SDF para determinar su posición y mezcla.
  • Efectos volumétricos como niebla, humo y rayos de luz usan los campos de distancia para determinar cuánto puede viajar un rayo a través del espacio vacío antes de golpear una superficie, sin importar si esa superficie fue rasterizada o recorrida con rayos.
  • Consultas de colisión y física contra la geometría estática del nivel usan una rejilla SDF horneada, mientras que los objetos dinámicos que la consultan son mallas de cuerpos rígidos estándar. La misma representación de campo que guía el renderizado también responde consultas de profundidad de penetración, dirección de separación y colisión continua, con aplicaciones que se extienden al pathfinding de IA y a las sombras suaves en tiempo real. Para una visión general de cómo encajan estas técnicas en un motor de videojuegos, consulta campos de distancia con signo en el desarrollo de videojuegos .

La idea clave es que la evaluación de SDF y la rasterización de triángulos operan en pasos separados que se alimentan mutuamente. Puedes rasterizar un personaje con hardware GPU tradicional y luego muestrear un campo de distancia en el shader de fragmentos para añadir sombreado suave del entorno. Puedes renderizar un sistema de partículas como cuadrados planos orientados a la cámara, y luego usar un SDF en el shader de vértices para repeler partículas de superficies procedurales. Las representaciones coexisten porque responden preguntas distintas: los triángulos responden “¿de qué color es este píxel?” y los SDF responden “¿a qué distancia está la superficie más cercana desde este punto?”.

Si deseas el contexto completo de recorrido, el ray marching con campos de distancia con signo cubre la búsqueda iterativa de impacto en detalle. Para el contexto de GPU a nivel de etapa, shaders de vértice y fragmento en el pipeline gráfico constituye un antecedente útil.

Resumen

Los campos de distancia con signo codifican formas como una función escalar con dos garantías sólidas: magnitud de distancia y signo interior/exterior. A partir de esa única representación, puedes:

  1. recorrer rayos con pasos seguros guiados por distancia
  2. componer escenas con operadores min y max
  3. estimar normales a partir de gradientes por diferencias finitas
  4. aplicar transformaciones de dominio para construir diseños procedurales complejos

Esa combinación de modelado compacto y lógica de evaluación reutilizable es la razón por la que los SDF siguen siendo una herramienta central en gráficos procedurales. Una vez que el contrato del campo está claro, muchas técnicas que parecen avanzadas se convierten en variaciones del mismo bucle: evaluar distancia, moverse o sombrear usando ese resultado, repetir.