Differentiable Rendering
A renderização diferenciável calcula como cada pixel renderizado muda com a forma, os materiais e a câmera da cena, permitindo ajustar cenas 3D a fotografias.
A renderização diferenciável é a renderização — transformar uma descrição da geometria, dos materiais, da iluminação e da câmara de uma cena 3D numa imagem — implementada de forma a permitir calcular a derivada de cada píxel de saída em relação a esses parâmetros da cena. Uma função de perda que compara uma imagem renderizada com uma fotografia pode então ser minimizada por descida do gradiente, com a retropropagação a percorrer o renderizador até à cena 3D. Isto faz dela o motor da renderização inversa, a tarefa de visão computacional que recupera uma cena a partir das respetivas imagens, e de métodos de renderização neural, como os campos de radiância neural (NeRF) e o Gaussian splatting, que treinam os modelos de cena através da sua renderização.
Porque é que a renderização precisa de tratamento especial#
Um rasterizador padrão não é diferenciável nos pontos importantes. A cobertura de um píxel por um triângulo é uma função em degrau das posições dos vértices, pelo que deslocar ligeiramente um vértice não altera nenhum píxel até uma aresta cruzar o centro de um píxel; assim, o gradiente em relação à geometria é zero em quase toda a parte. A oclusão acrescenta mais descontinuidades sempre que uma superfície oculta outra. Os renderizadores diferenciáveis tratam estas arestas de formas diferentes:
- Gradientes aproximados: OpenDR (2014) e o Neural 3D Mesh Renderer (2018) mantêm um rasterizador padrão na passagem direta e aproximam os gradientes na passagem inversa.
- Rasterização suave: O SoftRas (2019) substitui a cobertura rígida de cada píxel por uma probabilidade que diminui suavemente com a distância à aresta de um triângulo e combina faces sobrepostas, permitindo que cada píxel próximo de uma aresta transmita gradientes à geometria.
- Renderização diferenciável com base física: Traçadores de raios como o redner (2018) e o Mitsuba 3 (2022) amostram arestas de silhuetas ou reparametrizam a integral de renderização, fornecendo gradientes para sombras, reflexos e luz indireta.
- Renderização volumétrica e por splatting: A composição alfa das densidades ao longo de cada raio do NeRF e os Gaussianos 3D rasterizados do Gaussian splatting são, por construção, funções suaves dos respetivos parâmetros.
Um rasterizador suave para um único disco ilustra a ideia em PyTorch: a cobertura é uma sigmoide da distância com sinal à aresta do disco, pelo que os gradientes de cada píxel próximo do limite chegam ao centro e ao raio do disco.
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}")O programa apresenta center [40.0, 24.0], radius 12.0: começando a cerca de 26 píxeis de distância e com metade do raio, o otimizador Adam recupera o disco apenas a partir das diferenças entre píxeis. Com cobertura rígida, (distance < radius).float(), a perda não transmitiria gradiente a nenhum dos parâmetros.
Aplicações no mundo real#
As perdas de silhueta, como a do código, comparam a máscara renderizada de um objeto com uma máscara observada; para fotografias sem anotações, um modelo de segmentação de instâncias, como o YOLO26 (yolo26n-seg.pt), fornece uma máscara para cada objeto da imagem.
- Reconstrução 3D: O NeRF (2020) e o Gaussian splatting 3D (2023) ajustam uma cena a dezenas de fotografias com poses de câmara conhecidas; depois, o Gaussian splatting renderiza novas vistas em tempo real, a 30 fotogramas por segundo ou mais em 1080p.
- Ajuste do corpo humano: Os métodos baseados em modelos corporais ajustam uma malha paramétrica, como o SMPL, a uma imagem, fazendo corresponder a silhueta renderizada e as articulações projetadas à máscara e aos pontos-chave da pessoa.
- Geração de texto para 3D: O DreamFusion (2022) otimiza um NeRF para que as renderizações de pontos de vista aleatórios obtenham boas pontuações num modelo de difusão de texto para imagem, criando objetos 3D sem dados de treino 3D.










