Editor visual de formas SDF (Signed Distance Fields) en Unity que utiliza técnicas de raymarching para renderizar formas geométricas procedurales en tiempo real. Este proyecto permite crear, combinar y manipular formas 3D mediante funciones de distancia firmada, ofreciendo operaciones de mezcla suave (smooth blending) entre objetos.
- Esfera - Forma básica esférica con radio ajustable
- Caja - Cubo con dimensiones personalizables en cada eje
- Torus - Forma de dona con dos radios configurables
- Cápsula - Cilindro con extremos redondeados definido por dos puntos
- Pirámide - Pirámide de base cuadrada con altura ajustable
Cada forma puede combinarse con otras mediante tres operaciones:
- Unión - Combina formas aditivamente
- Sustracción - Resta una forma de otra
- Intersección - Mantiene solo la región donde las formas se solapan
Todas las operaciones soportan smooth blending para transiciones suaves entre formas.
- Posición - Control completo de ubicación en el espacio 3D
- Rotación - Rotación mediante quaternions para precisión matemática
- Escala - Escalado no uniforme en cada eje (X, Y, Z)
- Color por forma - Cada forma tiene su propio color RGBA
- Mezcla de colores - Los colores se interpolan suavemente en las operaciones de blend
- Iluminación difusa - Sistema de iluminación básico con luz direccional y ambiental
Gestor central del sistema que:
- Mantiene un registro de todas las formas SDF activas en la escena
- Actualiza los datos del shader en cada frame
- Gestiona el material de raymarching y el quad fullscreen
- Configura parámetros globales (max steps, max distance, surface distance)
- Soporta hasta 32 formas simultáneas
Parámetros de Raymarching:
maxSteps: Número máximo de iteraciones (default: 100)maxDistance: Distancia máxima de renderizado (default: 100)surfaceDistance: Precisión de detección de superficie (default: 0.001)
Componente que define formas individuales:
- Se registra automáticamente con el SDFManager al activarse
- Expone parámetros específicos según el tipo de forma
- Dibuja gizmos en el editor para visualización
- Permite configurar operación de blend y suavizado por forma
Tipos de forma (SDFShapeType):
public enum SDFShapeType
{
Sphere, // Esfera
Box, // Caja
Torus, // Torus
Capsule, // Cápsula
Pyramid // Pirámide
}Operaciones de blend (SDFBlendOperation):
public enum SDFBlendOperation
{
Union, // Unión
Subtraction, // Sustracción
Intersection // Intersección
}Shader personalizado que implementa:
- Algoritmo de raymarching para renderizado volumétrico
- Funciones SDF para cada tipo de geometría
- Operaciones de smooth blending con mezcla de colores
- Sistema de transformación (rotación por quaternion + escalado)
- Cálculo de normales mediante gradiente para iluminación
- Billboard rendering para el quad fullscreen
Funciones SDF implementadas:
sdSphere()- Distancia a esferasdBox()- Distancia a cajasdTorus()- Distancia a torussdCapsule()- Distancia a cápsulasdPyramid()- Distancia a pirámide
Operaciones de blend:
opSmoothUnion()- Unión suaveopSmoothSubtraction()- Sustracción suaveopSmoothIntersection()- Intersección suave
-
Crear el Manager:
- Añade un GameObject vacío a la escena
- Agrega el componente
SDFManager - El manager se configurará automáticamente como singleton
-
Añadir Formas:
- Crea un GameObject vacío
- Agrega el componente
SDFShape - Selecciona el tipo de forma en el inspector
- Ajusta parámetros (color, tamaño, operación de blend)
-
Configurar Transformaciones:
- Usa las herramientas estándar de Unity (Move, Rotate, Scale)
- Las transformaciones se aplican automáticamente al SDF
// Crear una esfera mediante código
GameObject sphereObj = new GameObject("SDF Sphere");
SDFShape sphere = sphereObj.AddComponent<SDFShape>();
sphere.ShapeType = SDFShapeType.Sphere;
sphere.SphereRadius = 1.0f;
sphere.ShapeColor = Color.red;
sphere.BlendOperation = SDFBlendOperation.Union;
sphere.BlendSmoothness = 0.5f;- Scene View Gizmos: Cada forma muestra una representación wireframe de su geometría
- Inspector: Todos los parámetros son editables en tiempo real
- Transform Tools: Posición, rotación y escala funcionan como objetos normales de Unity
El algoritmo de raymarching avanza a lo largo de un rayo desde la cámara, evaluando la función de distancia en cada paso. Cuando la distancia es menor que surfaceDistance, se considera que el rayo ha golpeado una superficie.
Las operaciones de blend utilizan la técnica de smooth minimum/maximum que crea transiciones suaves entre formas. El parámetro de suavizado (k) controla el radio de influencia de la mezcla.
- Rotación: Implementada mediante quaternions para evitar gimbal lock
- Escalado: Aplica corrección de distancia para mantener la precisión del SDF
- Espacio local: Cada forma se evalúa en su propio espacio de coordenadas
- Máximo de 32 formas simultáneas para mantener rendimiento
- Early exit en raymarching cuando se alcanza max distance
- Uso de arrays uniformes en el shader para datos de formas
- Unity 2020.3 o superior
- Shader Model 3.0 o superior
- Soporte para arrays en shaders
- Prototipado rápido de formas complejas
- Arte procedural y efectos visuales
- Modelado CSG (Constructive Solid Geometry)
- Visualización matemática de funciones de distancia
- Experimentación con técnicas de raymarching
- Añade el tipo al enum
SDFShapeType - Implementa la función SDF en el shader
- Añade el caso en
EvaluateShape() - Actualiza
SDFShape.cscon los parámetros necesarios - Añade visualización en
OnDrawGizmos()
El sistema de iluminación se encuentra en el fragment shader (frag()). Puedes añadir:
- Luz especular
- Sombras suaves
- Ambient occlusion
- Reflexiones
- El sistema usa
ExecuteAlwayspara funcionar en modo editor - Las formas se renderizan en orden de registro
- El color final resulta de la mezcla de todas las operaciones de blend
- Los gizmos muestran aproximaciones de las formas reales
Las formas no se ven:
- Verifica que el shader
Custom/SDFRaymarchingesté compilado - Asegúrate de que hay un SDFManager en la escena
- Revisa que las formas estén dentro del rango de
maxDistance
Rendimiento bajo:
- Reduce
maxStepsen el SDFManager - Disminuye el número de formas activas
- Aumenta
surfaceDistancepara menos precisión pero más velocidad
Artefactos visuales:
- Aumenta
maxStepspara más precisión - Reduce
surfaceDistancepara mejor detección de superficie - Verifica que las escalas no sean extremadamente pequeñas
Desarrollado con ❤️ usando Unity y técnicas de raymarching
