Un campo de distancia con signo muestreado es una rejilla precomputada de muestras de distancia que representa una forma para la que no existe una fórmula de distancia compacta. Las mallas de triángulos son la fuente más común: personajes, modelos escaneados, geometría de niveles y contornos de fuentes llegan todos como listas de vértices y caras en lugar de ecuaciones. El muestreo convierte esa malla en un campo que puedes consultar en cualquier punto del espacio.
Este artículo se apoya en el tutorial de campos de distancia con signo analíticos y asume que la convención de signos te resulta familiar: negativo en el interior, cero en la superficie, positivo en el exterior. Aquí la pregunta cambia de “cuál es la fórmula” a “cómo calculo y almaceno las distancias”.
Por Qué una Malla No Tiene un SDF de Forma Cerrada
Un SDF analítico funciona porque la forma tiene una estructura que la fórmula puede aprovechar. Una esfera se define por un centro y un radio, así que la distancia a su superficie es la distancia al centro menos el radio. Una caja se define por semiextensiones, así que su distancia sale de unos pocos componentes acotados. La fórmula es válida en todo el espacio y cuesta un puñado de operaciones aritméticas.
Una malla de triángulos no ofrece ese atajo. Es una colección arbitraria de triángulos sin centro, eje ni parametrización común, así que ninguna expresión devuelve la distancia a la superficie más cercana. Sí puedes escribir la distancia de forma cerrada de un punto a un único triángulo: proyecta el punto sobre el plano del triángulo y acótalo dentro del triángulo, y la longitud de esa diferencia es la distancia. La dificultad está en la palabra más cercano. La distancia real es el mínimo sobre todos los triángulos, y encontrar ese mínimo requiere una búsqueda. La prueba de interior y exterior añade una segunda pregunta global que ninguna fórmula por triángulo puede responder por sí sola.
Ese es el hueco que cubre el muestreo. Evalúa la búsqueda costosa en un conjunto finito de puntos de la rejilla, guarda las respuestas y deja que la interpolación responda al resto.
El Pipeline de Muestreo de Malla a SDF
Convertir una malla en un campo de distancia con signo suele llamarse voxelizar la malla, porque la salida es un volumen de celdas (vóxeles) que contienen cada una un valor de distancia. El pipeline tiene cuatro pasos.
1. Coloca una Rejilla sobre la Malla
Empieza con la caja envolvente de la malla y añade un pequeño margen para que el campo tenga espacio para volverse positivo fuera de la superficie. Después elige una resolución, el número de muestras a lo largo de cada eje. La rejilla se convierte en la representación: una vez muestreada, las consultas van a esta rejilla y nunca vuelven a tocar los triángulos. La resolución es el principal control de precisión y el principal costo de memoria, y la siguiente sección concreta esa compensación.
2. Encuentra la Distancia al Triángulo Más Cercano
Para cada punto de muestra de la rejilla, calcula la distancia a cada triángulo candidato y conserva la más pequeña. La distancia a un triángulo es la distancia al punto más cercano de él:
donde es el punto más cercano del triángulo . Ese punto más cercano cae dentro del triángulo, en uno de sus lados o en un vértice, y la misma proyección y acotación resuelven los tres casos. La distancia de malla sin signo es el mínimo sobre los triángulos:
Probar cada triángulo para cada muestra es correcto pero lento, así que los pipelines de producción aceleran la búsqueda con una jerarquía de volúmenes envolventes o una rejilla espacial que descarta pronto los triángulos lejanos. Otro enfoque escribe la distancia bruta solo cerca de la superficie y después la propaga por la rejilla con un barrido de transformada de distancia, que llega al mismo resultado en otro orden.
3. Decide de Qué Lado Está Cada Muestra
La distancia por sí sola da la magnitud, y el signo necesita una prueba de interior y exterior. Para una malla cerrada, el método estándar lanza un rayo desde la muestra y cuenta cuántos triángulos cruza: un número impar significa interior, un número par significa exterior. Una prueba de número de vueltas (winding number) es más robusta cuando los triángulos se solapan o la malla tiene pequeños defectos, y el número de vueltas generalizado la extiende a mallas que no están perfectamente cerradas. Una opción más barata para mallas cerradas llena por difusión (flood fill) la región exterior desde el borde de la rejilla y marca como interior todo lo que el llenado no alcanza.
Este paso es donde los SDF de malla fallan con más frecuencia. Si la malla tiene agujeros, caras duplicadas o un sentido de giro inconsistente, el signo se invierte cerca del defecto y el campo muestreado desarrolla parches invertidos. Las buenas implementaciones validan la estanqueidad antes de muestrear, o recurren a una prueba de número de vueltas que tolera la imperfección.
4. Almacena las Muestras e Interpola
Guarda las muestras con signo en una textura 3D o en un arreglo plano. En tiempo de ejecución, una consulta lee las ocho muestras que la rodean y las mezcla con interpolación trilineal. El resultado es una distancia aproximada que se mantiene continua entre celdas y es lo bastante barata para un shader.
La visualización muestra los mismos cuatro pasos en 2D, donde la malla es un polígono y la característica más cercana es un lado en lugar de un triángulo. Presiona play para recorrer la rejilla en orden de barrido: cada muestra encuentra su lado más cercano y registra una distancia con signo, marcada en rojo dentro, azul fuera y blanco en el límite. Activa el campo reconstruido para ver la interpolación bilineal rellenar los huecos entre muestras, y compara el contorno poligonal discontinuo con el contorno cero coloreado. A baja resolución el contorno redondea las esquinas y recorta los detalles finos; aumentar la resolución acerca el límite reconstruido a los bordes reales.
Resolución, Memoria y Detalle Perdido
El tamaño de la rejilla crece rápido con la resolución. Duplicar el número de muestras por eje multiplica el número de muestras por 4 en 2D y por 8 en 3D. Una rejilla de 128³ contiene unos 2 millones de muestras, mientras que una de 256³ contiene más de 16 millones. A dos bytes por muestra, un campo de 256³ ocupa unos 32 MB, y a cuatro bytes ocupa 64 MB, antes de cualquier compresión.
Ese costo compra precisión, y las esquinas son el lugar más difícil para gastarla. La distancia real cambia de dirección de forma abrupta al cruzar la bisectriz de una esquina, mientras que la interpolación trilineal solo puede producir una mezcla suave de las muestras circundantes, así que el contorno cero reconstruido redondea la esquina. El mismo efecto hace que los detalles más finos que un vóxel desaparezcan por completo del campo. Aumentar la resolución reduce ambos errores, pero la mejora es gradual y nunca exacta.
Dos trucos estándar reducen el costo en lugar del error. Una banda estrecha (narrow band) almacena muestras solo dentro de unas pocas celdas de la superficie y omite el interior y el exterior uniformes, donde la distancia es predecible. El almacenamiento disperso y la codificación por longitud de racha comprimen después las grandes regiones vacías. Ambos mantienen igual el comportamiento de consulta mientras recortan la memoria que necesitaría una rejilla completa.
Cómo Trabajar con un Campo Muestreado
Una vez muestreado, un campo alimenta el mismo pipeline posterior que un SDF analítico. Las operaciones CSG consumen valores escalares, así que la unión, la intersección y la diferencia funcionan sin cambios en campos muestreados. Las normales de superficie siguen saliendo de diferencias finitas entre muestras vecinas, y el ray marching sigue avanzando por el campo.
La diferencia práctica importante es la seguridad del paso. Un SDF analítico nunca sobreestima la distancia a la superficie, que es lo que hace seguro el sphere tracing con pasos iguales al valor del campo. La interpolación trilineal no conserva esa garantía: el valor interpolado puede superar la distancia real entre muestras, sobre todo cerca de las esquinas. Los ray marchers tratan un campo muestreado como un límite inferior conservador, amplían sus márgenes de seguridad y usan un multiplicador de paso más pequeño.
Campos de Distancia de Malla en Producción
Unreal Engine 5 muestrea mallas de triángulos estáticas en rejillas de vóxeles dispersas y usa los campos de distancia de malla resultantes para sombras de campo de distancia, oclusión ambiental y consultas de colisión. El preprocesamiento se ejecuta sin conexión durante la creación de contenido, así que el costo en tiempo de ejecución son búsquedas en la rejilla e interpolación. Los motores de física se apoyan en la misma representación para colisiones entre mallas complejas, a menudo con una resolución más gruesa que cambia precisión espacial por velocidad y que puede reconstruirse cada fotograma para objetos deformables.
El antecesor 2D de este pipeline es el renderizado de texto con campos de distancia con signo de Valve. Los contornos de los glifos se muestrean una vez en una textura de distancia, y el filtrado bilineal por hardware reconstruye bordes nítidos y suavizados a cualquier aumento. El pipeline de malla a SDF de este artículo es la versión 3D de la misma idea.
Cuando la malla cambia en cada fotograma, muestrear una rejilla puede ser demasiado lento. Una alternativa en tiempo de ejecución evalúa la distancia al triángulo más cercano directamente desde una jerarquía de volúmenes envolventes en cada consulta, cambiando el preprocesamiento por una búsqueda nueva. Las rejillas precomputadas siguen siendo la mejor opción cuando la geometría es estática y las consultas son frecuentes.
Más Allá de las Rejillas Uniformes
Dos extensiones abordan las limitaciones de una rejilla uniforme.
Los campos de distancia muestreados adaptativamente (ADF) reemplazan la rejilla por un octree que muestrea densamente cerca de las características de la superficie y de forma dispersa en regiones planas, recortando memoria y conservando el detalle. La compensación es el recorrido: las consultas navegan por un árbol en lugar de indexar un arreglo plano, lo que es más difícil de acelerar en hardware GPU de función fija.
Los campos de distancia con signo multicanal (MSDF) almacenan distancias a varios bordes cercanos por celda, usando canales extra en una textura. La interpolación toma el mínimo entre canales, lo que conserva las esquinas afiladas que un campo de un solo canal redondearía, a cambio de tres a cuatro veces la memoria. Los MSDF son estándar en el renderizado de texto de alta calidad y son comunes para gráficos vectoriales en GPU.
Ambos se basan en el mismo principio de muestreo: muestrear la distancia real, almacenarla y reconstruirla en tiempo de ejecución.