Differentiable Rendering
Le rendu différentiable calcule comment chaque pixel rendu varie en fonction de la forme de la scène, de ses matériaux et de la caméra, afin d’ajuster des scènes 3D à des photos.
Le rendu différentiable consiste à générer une image à partir d’une description de la géométrie, des matériaux, de l’éclairage et de la caméra d’une scène 3D, en calculant la dérivée de chaque pixel produit par rapport à ces paramètres de scène. Une fonction de perte qui compare une image rendue à une photo peut alors être minimisée par descente de gradient, tandis que la rétropropagation traverse le moteur de rendu jusqu’à la scène 3D. Le rendu différentiable est ainsi le moteur du rendu inverse, tâche de vision par ordinateur qui consiste à retrouver une scène à partir de ses images, ainsi que des méthodes de rendu neuronal, comme les champs de radiance neuronaux (NeRF) et le splatting gaussien, qui entraînent leurs modèles de scène en les rendant.
Pourquoi le rendu nécessite un traitement particulier#
Un rasteriseur standard n’est pas différentiable aux endroits importants. Le fait qu’un pixel soit couvert ou non par un triangle est une fonction en escalier des positions des sommets : déplacer légèrement un sommet ne change aucun pixel tant qu’une arête ne traverse pas le centre d’un pixel, et le gradient par rapport à la géométrie est donc nul presque partout. L’occultation ajoute d’autres discontinuités partout où une surface en masque une autre. Les moteurs de rendu différentiables traitent ces arêtes de différentes façons :
- Gradients approximatifs : OpenDR (2014) et Neural 3D Mesh Renderer (2018) conservent un rasteriseur standard lors de la passe avant et approximent les gradients lors de la passe arrière.
- Rasterisation douce : SoftRas (2019) remplace la couverture binaire de chaque pixel par une probabilité qui décroît progressivement avec la distance à l’arête d’un triangle, et mélange les faces qui se chevauchent afin que chaque pixel proche d’une arête transmette un gradient à la géométrie.
- Rendu différentiable fondé sur la physique : les moteurs de lancer de rayons comme redner (2018) et Mitsuba 3 (2022) échantillonnent les contours des silhouettes ou reparamètrent l’intégrale de rendu, ce qui fournit des gradients pour les ombres, les reflets et la lumière indirecte.
- Rendu volumique et par splats : le compositing alpha des densités le long de chaque rayon dans NeRF et la rasterisation des gaussiennes 3D du splatting gaussien sont, par construction, des fonctions lisses de leurs paramètres.
Un rasteriseur doux pour un disque unique illustre le principe dans PyTorch : la couverture est une sigmoïde de la distance signée au bord du disque, de sorte que les gradients atteignent son centre et son rayon depuis chaque pixel proche du contour.
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}")Il affiche center [40.0, 24.0], radius 12.0 : en partant d’une position à environ 26 pixels avec la moitié du rayon, l’optimiseur Adam retrouve le disque à partir des seules différences entre pixels. Avec une couverture binaire, (distance < radius).float(), la perte ne transmettrait de gradient à aucun des deux paramètres.
Applications concrètes#
Les pertes de silhouette comme celle du code comparent le masque rendu d’un objet à un masque observé ; pour les photos sans annotations, un modèle de segmentation d’instances comme YOLO26 (yolo26n-seg.pt) fournit un masque pour chaque objet de l’image.
- Reconstruction 3D : NeRF (2020) et le splatting gaussien 3D (2023) ajustent une scène à des dizaines de photos dont les poses de caméra sont connues ; le splatting gaussien génère ensuite de nouveaux points de vue en temps réel, à 30 images par seconde ou plus en 1080p.
- Ajustement du corps humain : les méthodes de modèle corporel ajustent un maillage paramétrique comme SMPL à une image en faisant correspondre sa silhouette rendue et ses articulations projetées au masque et aux points clés de la personne.
- Génération de texte en 3D : DreamFusion (2022) optimise un NeRF pour que ses rendus depuis des points de vue aléatoires obtiennent un bon score avec un modèle de diffusion texte-image, créant ainsi des objets 3D sans données d’entraînement 3D.










