Differentiable Rendering
El renderizado diferenciable calcula cómo cambia cada píxel renderizado con la forma, los materiales y la cámara de la escena, lo que permite ajustar escenas 3D a fotografías.
El renderizado diferenciable es un proceso de renderizado que convierte una descripción de la geometría, los materiales y la iluminación de una escena 3D, así como de la cámara, en una imagen, y que está implementado de modo que se pueda calcular la derivada de cada píxel de salida respecto a esos parámetros de la escena. Así, se puede minimizar mediante descenso del gradiente una función de pérdida que compare una imagen renderizada con una fotografía, y ejecutar la retropropagación a través del renderizador hasta llegar a la escena 3D. Esto lo convierte en el motor del renderizado inverso, la tarea de visión artificial que recupera una escena a partir de sus imágenes, y de métodos de renderizado neuronal como los campos de radiancia neuronal (NeRF) y el splatting gaussiano, que entrenan sus modelos de escena renderizándolos.
Por qué el renderizado necesita un tratamiento especial#
Un rasterizador estándar no es diferenciable allí donde importa. Que un triángulo cubra un píxel depende de una función escalonada de la posición de sus vértices. Por eso, mover ligeramente un vértice no cambia ningún píxel hasta que una arista cruza el centro de un píxel, y el gradiente respecto a la geometría es cero en casi todas partes. La oclusión añade más discontinuidades allí donde una superficie oculta a otra. Los renderizadores diferenciables tratan estas aristas de distintas formas:
- Gradientes aproximados: OpenDR (2014) y Neural 3D Mesh Renderer (2018) conservan un rasterizador estándar en la pasada hacia delante y aproximan los gradientes en la pasada hacia atrás.
- Rasterización suave: SoftRas (2019) sustituye la cobertura rígida de cada píxel por una probabilidad que disminuye suavemente a medida que aumenta la distancia a la arista de un triángulo, y mezcla las caras superpuestas. Así, todos los píxeles cercanos a una arista transmiten gradiente a la geometría.
- Renderizado diferenciable basado en la física: Los trazadores de rayos, como redner (2018) y Mitsuba 3 (2022), muestrean los bordes de las siluetas o reparametrizan la integral de renderizado para obtener gradientes de sombras, reflejos e iluminación indirecta.
- Renderizado volumétrico y por splats: La composición alfa de las densidades a lo largo de cada rayo en NeRF y los Gaussianos 3D rasterizados del splatting gaussiano son, por construcción, funciones suaves de sus parámetros.
Un rasterizador suave para un único disco ilustra la idea en PyTorch: la cobertura es una sigmoide de la distancia con signo al borde del disco, por lo que los gradientes llegan al centro y al radio desde todos los píxeles cercanos al límite.
import torch
# Pixel coordinates of a 64x64 image
ys, xs = torch.meshgrid(torch.arange(64.0), torch.arange(64.0), indexing="ij")
def render(center, radius):
"""Soft-rasterize a disk: pixel coverage is a sigmoid of the signed distance to its edge."""
distance = torch.sqrt((xs - center[0]) ** 2 + (ys - center[1]) ** 2 + 1e-6)
return torch.sigmoid(radius - distance)
# Target image: a disk at (40, 24) with radius 12
target = render(torch.tensor([40.0, 24.0]), torch.tensor(12.0))
# Recover the scene from a wrong guess by backpropagating the pixel loss
center = torch.tensor([20.0, 40.0], requires_grad=True)
radius = torch.tensor(6.0, requires_grad=True)
optimizer = torch.optim.Adam([center, radius], lr=0.5)
for _ in range(300):
loss = ((render(center, radius) - target) ** 2).mean()
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"center {center.detach().round(decimals=1).tolist()}, radius {radius.item():.1f}")Imprime center [40.0, 24.0], radius 12.0: partiendo de una posición a unos 26 píxeles de distancia y con la mitad del radio, el optimizador Adam recupera el disco basándose únicamente en las diferencias entre píxeles. Con cobertura rígida, (distance < radius).float(), la pérdida no transmitiría ningún gradiente a ninguno de los parámetros.
Aplicaciones en el mundo real#
Las pérdidas de silueta, como la del código, comparan la máscara renderizada de un objeto con una máscara observada. Para las fotografías sin anotaciones, un modelo de segmentación de instancias, como YOLO26 (yolo26n-seg.pt), proporciona una máscara para cada objeto de la imagen.
- Reconstrucción 3D: NeRF (2020) y el splatting gaussiano 3D (2023) ajustan una escena a decenas de fotografías con posiciones de cámara conocidas. A continuación, el splatting gaussiano renderiza nuevas vistas en tiempo real, a 30 fotogramas por segundo o más con una resolución de 1080p.
- Ajuste del cuerpo humano: Los métodos de modelado corporal ajustan a una imagen una malla paramétrica como SMPL, haciendo coincidir su silueta renderizada y sus articulaciones proyectadas con la máscara y los puntos clave de la persona.
- Generación de texto a 3D: DreamFusion (2022) optimiza un NeRF para que las imágenes renderizadas desde puntos de vista aleatorios obtengan buenas puntuaciones en un modelo de difusión de texto a imagen, y así crea objetos 3D sin datos de entrenamiento 3D.










