Differentiable Rendering
미분 가능한 렌더링은 렌더링된 각 픽셀이 장면의 형태, 재질, 카메라에 따라 어떻게 달라지는지 계산하므로, 3D 장면을 사진에 맞출 수 있습니다.
미분 가능 렌더링은 렌더링, 즉 3D 장면의 기하 구조, 재질, 조명, 카메라에 대한 설명을 이미지로 변환하는 작업을 출력 픽셀 각각을 장면 매개변수에 대해 미분할 수 있도록 구현한 것입니다. 렌더링된 이미지와 사진을 비교하는 손실 함수를 경사 하강법으로 최소화하고, 역전파를 렌더러를 거쳐 3D 장면까지 수행할 수 있습니다. 이 방식은 이미지에서 장면을 복원하는 컴퓨터 비전 과제인 역렌더링의 핵심 엔진이며, 장면 모델을 렌더링해 학습하는 신경 렌더링 기법인 신경 방사장(NeRF)과 가우시안 스플래팅의 엔진이기도 합니다.
렌더링에 특별한 처리가 필요한 이유#
일반적인 래스터라이저는 중요한 부분에서 미분 가능하지 않습니다. 픽셀이 삼각형에 포함되는지는 꼭짓점 위치에 따른 계단 함수이므로, 꼭짓점을 조금 움직여도 모서리가 픽셀 중심을 가로지를 때까지 픽셀은 바뀌지 않습니다. 따라서 기하 구조에 대한 그래디언트는 거의 모든 곳에서 0이며, 가려짐은 한 표면이 다른 표면을 가리는 곳마다 불연속성을 더합니다. 미분 가능 렌더러는 이러한 모서리를 여러 방식으로 처리합니다.
- 근사 그래디언트: OpenDR(2014)과 Neural 3D Mesh Renderer(2018)는 순전파에 일반 래스터라이저를 사용하고 역전파에서 그래디언트를 근사합니다.
- 소프트 래스터화: SoftRas(2019)는 각 픽셀의 이진 커버리지를 삼각형 모서리와의 거리에 따라 부드럽게 감소하는 확률로 바꾸고 겹치는 면을 혼합합니다. 따라서 모서리 근처의 모든 픽셀에서 기하 구조로 그래디언트가 전달됩니다.
- 물리 기반 미분 가능 렌더링: redner(2018)와 Mitsuba 3(2022) 같은 광선 추적기는 실루엣 모서리를 샘플링하거나 렌더링 적분을 재매개변수화하여 그림자, 반사, 간접광에 대한 그래디언트를 계산합니다.
- 볼륨 및 스플랫 렌더링: 각 광선을 따라 밀도를 알파 합성하는 NeRF와 래스터화된 3D 가우시안을 사용하는 가우시안 스플래팅은 구조적으로 매개변수에 대해 부드러운 함수입니다.
단일 원판을 위한 소프트 래스터라이저로 PyTorch에서 이 개념을 확인할 수 있습니다. 커버리지는 원판 모서리까지의 부호 있는 거리에 대한 시그모이드 함수이므로, 경계 근처의 모든 픽셀에서 중심과 반지름으로 그래디언트가 전달됩니다.
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}")center [40.0, 24.0], radius 12.0을 출력합니다. 반지름의 절반인 상태에서 약 26픽셀 떨어진 곳부터 시작해도 Adam 옵티마이저는 픽셀 차이만으로 원판을 복원합니다. 하드 커버리지를 사용했다면 (distance < radius).float()와 같이 손실이 두 매개변수 어느 쪽에도 그래디언트를 전달하지 못했을 것입니다.
실제 적용 사례#
코드의 실루엣 손실과 같은 손실은 렌더링된 객체 마스크를 관측된 마스크와 비교합니다. 어노테이션이 없는 사진에서는 YOLO26(yolo26n-seg.pt)과 같은 인스턴스 세그멘테이션 모델이 이미지의 모든 객체에 대한 마스크를 제공합니다.
- 3D 재구성: NeRF(2020)와 3D 가우시안 스플래팅(2023)은 카메라 포즈가 알려진 수십 장의 사진에 장면을 맞춥니다. 이후 가우시안 스플래팅은 실시간으로 새 뷰를 렌더링하며, 1080p에서 초당 30프레임 이상을 처리합니다.
- 인체 피팅: 인체 모델 방식은 렌더링된 실루엣과 투영된 관절을 사람의 마스크 및 키포인트에 맞춰 SMPL 같은 매개변수 메시를 이미지에 피팅합니다.
- 텍스트-3D 생성: DreamFusion(2022)은 무작위 시점에서 렌더링한 결과가 텍스트-이미지 Diffusion 모델에서 높은 점수를 얻도록 NeRF를 최적화해, 3D 학습 데이터 없이 3D 객체를 생성합니다.










