Los entornos destructibles son uno de los problemas más difíciles del renderizado en videojuegos. Una malla tradicional debe ser retriangulada cada vez que cambia la superficie, lo que es costoso y crea recuentos de triángulos impredecibles. Los SDF manejan la destrucción de forma natural porque tallar un agujero es solo una resta CSG, una operación sobre un campo escalar. Este artículo cubre la operación de tallado, cómo escala el árbol de SDF a medida que se acumulan las deformaciones, el paso de extracción con Marching Cubes que vuelve a convertir el campo en triángulos, y los enfoques híbridos que usan los motores en la práctica.
Para los operadores CSG y los fundamentos del sphere tracing, comienza con la visión general de los Campos de Distancia con Signo . Para el contexto a nivel de motor, consulta los SDF en el desarrollo de videojuegos .
Tallar Terreno Destructible con Resta CSG
Cuando una explosión elimina un trozo esférico de terreno, el SDF se actualiza con una sola operación:
float crateredTerrainSDF(vec3 p) {
float terrain = terrainBaseSDF(p);
float crater = sphereSDF(p, explosionCenter, explosionRadius);
return max(terrain, -crater); // CSG subtraction
}
El patrón max(a, -b) resta el volumen B del volumen A. Cualquier punto que estaba tanto dentro del terreno como dentro de la esfera de explosión ahora está fuera (su distancia se vuelve positiva), tallando un agujero exactamente donde ocurrió la explosión. La actualización cuesta una primitiva adicional por explosión, no una retriangulación completa.
Un ejemplo práctico muestra la resta actuando sobre valores reales. Toma un terreno plano donde el SDF base es el plano (negativo debajo de la superficie, positivo encima) y una explosión centrada en con radio 3. El SDF del cráter es .
Prueba tres puntos:
- : terreno (1.5 unidades por debajo de la superficie), cráter (dentro de la explosión). Combinado: . El punto que solía ser suelo sólido ahora está 1.5 unidades fuera del terreno. Fue tallado.
- : terreno , cráter . Combinado: . Sigue en la superficie, sin cambios.
- : terreno , cráter . Combinado: . Justo fuera del borde de la explosión, sin cambios.
El primer punto es el tallado en sí: el suelo que era sólido ahora está vacío. Los otros dos muestran que el terreno intacto conserva sus valores de distancia exactos, de modo que el campo combinado sigue siendo un SDF válido en todas partes excepto donde la esfera se superpone con el terreno.
Esto escala a múltiples deformaciones secuenciales. Cada nuevo cráter añade un término más a la expresión del SDF. Después de 50 explosiones, el SDF es un árbol con 51 primitivas (1 terreno base + 50 operaciones de resta), y evaluarlo en un punto cuesta 51 cálculos de distancia de primitivas. Eso es crecimiento lineal en el número de eventos de deformación, pero constante por evaluación, sin topología de malla que mantener. Cuando muchos cráteres se superponen, el árbol sigue siendo correcto porque cada término max solo hace que un punto quede más afuera, que es exactamente la semántica de eliminar material.
Extracción de Mallas para Renderizado
El terreno basado en SDF todavía necesita convertirse en triángulos para el pipeline de rasterización, a menos que renderices por completo con ray marching. El puente estándar es Marching Cubes, que extrae una isosuperficie de un campo escalar muestreado. Dado que el SDF codifica la superficie como el conjunto de nivel cero, Marching Cubes extrae naturalmente una malla de triángulos que aproxima la forma actual del terreno.
El pipeline completo se ve así:
- Mantén un SDF de terreno base, posiblemente muestreado de un heightmap o ruido procedimental.
- Aplica resta CSG para cada evento de deformación (explosiones, excavación, construcción).
- Muestrea el SDF combinado en una rejilla 3D alrededor de la región deformada.
- Ejecuta Marching Cubes sobre esas muestras para producir una malla de triángulos.
- Sube la malla a la GPU para la rasterización.
Los pasos 3 a 5 se repiten cada fotograma en la región afectada, pero la rejilla suele ser pequeña (64³ o 128³) y la extracción es lo bastante rápida para uso en tiempo real. Juegos como Astroneer y Deep Rock Galactic usan variaciones de este pipeline para su terreno destructible.
Dos decisiones de ajuste dominan la calidad de la extracción. La primera es la resolución de la rejilla: duplicar la resolución multiplica el número de muestras por 8 en 3D, así que el tamaño de la rejilla es un presupuesto directo de memoria y tiempo. La segunda es dónde vive la rejilla: extraer solo alrededor de la región deformada mantiene el costo acotado sin importar cuán grande sea el nivel, mientras que re-extraer el mundo entero cada fotograma no escala. Las compensaciones de muestreo e interpolación son las mismas que rigen los campos de distancia con signo horneados ; el hub de Marching Cubes cubre el algoritmo de extracción en sí.
Enfoques Híbridos
No todas las superficies destructibles necesitan un SDF volumétrico completo. Un híbrido común es representar el terreno como un heightfield 2D con un SDF 2D que codifica información de salientes y cuevas. El heightfield maneja la superficie primaria a bajo costo, y el SDF maneja las características cóncavas y los túneles que un heightfield no puede representar.
Otro híbrido almacena el historial de deformación como una lista de primitivas restadas (esferas, cajas, cápsulas) y las evalúa en tiempo de ejecución solo donde se necesita. Lejos de cualquier deformación, el terreno base se evalúa rápidamente. Cerca de las deformaciones, los términos CSG adicionales añaden costo, pero solo en las regiones donde el detalle es alto. Este es el mismo principio que el árbol de SDF de la sección de tallado, pero con el árbol mantenido perezoso: las primitivas solo se consultan cuando una consulta cae dentro de su región delimitadora.
El híbrido que más aparece en los juegos publicados combina todos estos: un heightfield para el terreno amplio, un pequeño volumen de SDF volumétrico para la región alrededor de las deformaciones activas, y una lista de eventos de deformación que se puede reproducir para reconstruir cualquiera de las dos representaciones cuando el nivel se guarda o se carga.
Resumen
La destrucción es donde las fortalezas representacionales del SDF se alinean con mayor claridad:
- Tallado es una resta CSG,
max(terrain, -crater), que elimina exactamente el volumen explotado y sigue siendo un campo de distancia válido en todos los demás lugares. - Escalado es lineal en el número de eventos de deformación y constante por evaluación, sin topología de malla que reparar.
- Renderizado re-extrae triángulos con Marching Cubes desde una pequeña rejilla alrededor de la región deformada.
- Híbridos combinan heightfields, listas de deformación perezosas y SDF volumétricos para mantener el costo proporcional al daño real.
El mismo campo que almacena el terreno tallado también responde las consultas de colisión que los jugadores disparan contra él, y las pasadas de sombras y AO que lo iluminan.