Differentiable Rendering
Differenzierbares Rendering berechnet, wie sich jedes gerenderte Pixel mit Form, Materialien und Kamera der Szene verändert, sodass sich 3D-Szenen an Fotos anpassen lassen.
Differenzierbares Rendering ist das Rendern, also die Umwandlung einer Beschreibung der Geometrie, Materialien, Beleuchtung und Kamera einer 3D-Szene in ein Bild, die so implementiert ist, dass sich die Ableitung jedes Ausgabepixels nach diesen Szenenparametern berechnen lässt. Eine Verlustfunktion, die ein gerendertes Bild mit einem Foto vergleicht, kann dann per Gradientenabstieg minimiert werden, wobei die Backpropagation durch den Renderer bis in die 3D-Szene verläuft. Damit bildet differenzierbares Rendering die Grundlage des inversen Renderings, der Computer-Vision-Aufgabe, eine Szene aus ihren Bildern zu rekonstruieren, sowie von Methoden des neuronalen Renderings wie Neural Radiance Fields (NeRF) und Gaussian Splatting, die ihre Szenenmodelle durch Rendern trainieren.
Warum Rendering besondere Behandlung erfordert#
Ein gewöhnlicher Rasterizer ist dort nicht differenzierbar, wo es darauf ankommt. Ob ein Pixel von einem Dreieck bedeckt wird, hängt als Sprungfunktion von den Scheitelpunktpositionen ab. Eine geringfügige Verschiebung eines Scheitelpunkts verändert daher kein Pixel, bis eine Kante ein Pixelzentrum kreuzt, und der Gradient bezüglich der Geometrie ist fast überall null. Verdeckungen bringen weitere Unstetigkeiten an allen Stellen mit sich, an denen eine Oberfläche eine andere verdeckt. Differenzierbare Renderer behandeln diese Kanten auf unterschiedliche Weise:
- Approximierte Gradienten: OpenDR (2014) und der Neural 3D Mesh Renderer (2018) verwenden im Vorwärtsdurchlauf einen gewöhnlichen Rasterizer und approximieren die Gradienten im Rückwärtsdurchlauf.
- Weiche Rasterisierung: SoftRas (2019) ersetzt die harte Abdeckung jedes Pixels durch eine Wahrscheinlichkeit, die mit zunehmendem Abstand von einer Dreieckskante gleichmäßig abnimmt, und überlagert sich überschneidende Flächen. So leitet jedes Pixel in Kantennähe einen Gradienten an die Geometrie weiter.
- Physikalisch basiertes differenzierbares Rendering: Raytracer wie redner (2018) und Mitsuba 3 (2022) tasten Silhouettenkanten ab oder parametrisieren das Renderingintegral neu, wodurch sich Gradienten für Schatten, Reflexionen und indirektes Licht ergeben.
- Volumen- und Splat-Rendering: Das Alpha-Compositing der Dichten entlang jedes Strahls bei NeRF und die gerasterten 3D-Gauß-Verteilungen beim Gaussian Splatting sind konstruktionsbedingt glatte Funktionen ihrer Parameter.
Ein weicher Rasterizer für eine einzelne Scheibe veranschaulicht die Idee in PyTorch: Die Abdeckung ist eine Sigmoidfunktion des vorzeichenbehafteten Abstands zur Scheibenkante, sodass Pixel in Kantennähe Gradienten an Mittelpunkt und Radius weitergeben.
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}")Die Ausgabe lautet center [40.0, 24.0], radius 12.0: Ausgehend von einer Position, die etwa 26 Pixel entfernt ist, und einem halb so großen Radius rekonstruiert der Adam-Optimierer die Scheibe allein anhand von Pixelunterschieden. Bei harter Abdeckung, (distance < radius).float(), würde der Verlust keine Gradienten an einen der beiden Parameter weitergeben.
Anwendungen in der Praxis#
Silhouettenverluste wie der im Code vergleichen eine gerenderte Objektmaske mit einer beobachteten Maske. Für Fotos ohne Annotationen liefert ein Instanzsegmentierungsmodell wie YOLO26 (yolo26n-seg.pt) eine Maske für jedes Objekt im Bild.
- 3D-Rekonstruktion: NeRF (2020) und 3D Gaussian Splatting (2023) passen eine Szene an Dutzende von Fotos mit bekannten Kamerapositionen an. Gaussian Splatting rendert anschließend neue Ansichten in Echtzeit mit 30 Bildern pro Sekunde oder mehr bei 1080p.
- Anpassung des menschlichen Körpers: Methoden mit Körpermodellen passen ein parametrisches Netz wie SMPL an ein Bild an, indem sie dessen gerenderte Silhouette und projizierte Gelenke mit der Maske und den Keypoints der Person abgleichen.
- Text-zu-3D-Generierung: DreamFusion (2022) optimiert ein NeRF so, dass seine Renderings aus zufälligen Blickwinkeln von einem Text-zu-Bild-Diffusionsmodell gut bewertet werden. So entstehen 3D-Objekte ohne 3D-Trainingsdaten.










