Inverse Rendering
역 렌더링은 사진에서 출발해 사진을 만들어 낸 형상, 재질, 조명, 카메라를 역으로 추론하여 재조명과 재질 편집을 가능하게 합니다.
역렌더링은 하나 이상의 이미지에서 그 뒤에 있는 물리적 장면, 즉 객체의 3D 형상, 표면 재질, 조명, 그리고 촬영 카메라를 복원하는 과정입니다. 컴퓨터 그래픽스의 렌더링은 장면 설명을 픽셀로 변환하는 순방향 과정입니다. 역렌더링은 동일한 물리 법칙을 역으로 적용해 관측된 사진을 재현할 장면 매개변수를 탐색합니다. 역렌더링은 컴퓨터 비전과 그래픽스가 만나는 분야이며 역그래픽스라고도 합니다. Stephen Marschner의 1998년 코넬대학교 박사학위 논문 Inverse Rendering for Computer Graphics은 사진에서 조명과 표면 반사율을 복원하는 작업을 이러한 종류의 역문제로 정립했습니다.
합성에 의한 분석#
대부분의 역렌더링 방법은 분석 후 합성이라고 하는 반복 과정을 따릅니다. 장면을 추정하고 렌더링한 뒤 결과를 실제 사진과 비교하고, 차이를 줄이도록 추정값을 조정합니다. 미분 가능 렌더링은 각 조정을 효율적으로 수행합니다. 렌더러가 모든 장면 매개변수에 대해 각 픽셀이 어떻게 변하는지 알려 주므로, 경사 하강법은 신경망을 학습하는 역전파와 같은 방식으로 수천 개의 매개변수를 한 번에 업데이트할 수 있습니다. Mitsuba 3과 같은 물리 기반 미분 가능 렌더러는 이를 그림자, 반사, 표면 사이의 빛 반사까지 확장합니다.
가장 단순한 장면, 즉 하나의 먼 광원으로 조명된 무광 구체의 경우, 이 반복 과정은 PyTorch 몇 줄로 구현할 수 있습니다. 아래 코드는 옵티마이저에 공개하지 않은 광원 방향과 표면 밝기(알베도)로 목표 사진을 렌더링한 다음, 픽셀만으로 두 값을 모두 복원합니다. 이때 Adam 옵티마이저를 사용합니다.
import torch
import torch.nn.functional as F
# Unit normals of a sphere seen head-on, on a 64 x 64 pixel grid
y, x = torch.meshgrid(torch.linspace(-1, 1, 64), torch.linspace(-1, 1, 64), indexing="ij")
z = (1 - x**2 - y**2).clamp(min=0).sqrt()
normals = torch.stack([x, y, z], dim=-1)[z > 0]
# Lambertian "photo" lit from a direction the optimizer never sees, with albedo 0.8
photo = 0.8 * (normals @ F.normalize(torch.tensor([0.6, -0.4, 0.7]), dim=0)).clamp(min=0)
# Fit light direction and albedo: render, compare with the photo, follow the gradients
light = torch.tensor([0.0, 0.0, 1.0], requires_grad=True)
albedo = torch.tensor(0.3, requires_grad=True)
optimizer = torch.optim.Adam([light, albedo], lr=0.02)
for _ in range(500):
render = albedo * (normals @ F.normalize(light, dim=0)).clamp(min=0)
loss = (render - photo).pow(2).mean()
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"Light direction: {F.normalize(light.detach(), dim=0).numpy().round(3)}, albedo: {albedo.item():.3f}")이 코드는 숨겨진 값인 Light direction: [ 0.597 -0.398 0.697], albedo: 0.800을 정확하게 출력합니다. 프로덕션 시스템도 같은 반복 과정을 사용하지만, 한 줄짜리 셰이딩 모델을 완전한 광전달 모델로 대체하며, 미지수는 메시, 텍스처 맵, 환경 조명으로 확장됩니다.
문제가 모호한 이유#
서로 다른 많은 장면이 동일한 이미지를 만들어낼 수 있습니다. 어두운 부분은 더 어두운 페인트, 그림자, 또는 빛에서 멀어지는 방향으로 기울어진 표면일 수 있으며, 밝은 부분은 광택이 있는 재질이나 적절한 위치에 놓인 램프일 수 있습니다. 밝기만으로도 답은 모호합니다. 조명을 두 배로 밝히고 알베도를 절반으로 줄이면 픽셀이 동일해지기 때문에, 코드 조각에서는 조명 방향을 정규화하고 모든 밝기를 알베도에 반영합니다. 다음 세 가지 방법으로 가능한 답의 범위를 좁힙니다:
- 더 많은 관측: 물체를 여러 시점에서 촬영하거나, 광도 스테레오에서처럼 여러 개의 알려진 조명을 사용하면 단일 사진보다 형상과 재질을 훨씬 더 정확하게 제약할 수 있습니다.
- 학습된 사전 정보: 렌더링된 장면의 대규모 컬렉션으로 학습한 네트워크는 하나의 이미지에서 그럴듯한 법선, 재질 또는 조명을 예측하여 옵티마이저가 출발할 강력한 초기값을 제공합니다.
- 알려진 기하 구조: 깊이 센서나 깊이 모델에서 형상을 얻으면, 미지수는 재질과 조명으로 줄어듭니다.
단일 이미지 깊이 추정은 일반 사진에 필요한 기하 정보를 제공합니다. Ultralytics YOLO26 깊이 모델은 하나의 RGB 이미지에서 픽셀별 깊이 맵을 미터 단위로 예측합니다. 이 깊이 맵의 기울기에서 계산한 표면 법선은 구체 예제에서 주어진 것으로 간주하는 음영 기하 정보입니다.
역 렌더링과 재구성 및 신경 렌더링 비교#
3D 재구성은 흔히 운동으로부터의 구조와 다중 시점 스테레오를 사용해 기하 구조를 복원하며, 일반적으로 촬영 당시의 조명을 표면 색상에 반영합니다. 신경 방사장과 가우시안 스플래팅은 동일한 렌더링 및 비교 과정을 통해 최적화되지만, 표면과 조명을 분리하지 않은 채 각 방향에서 장면이 어떻게 보이는지를 모델링하므로 새로운 시점에도 원래 조명이 유지됩니다. 역렌더링의 목표는 이 둘을 분리하는 것이며, 이를 통해 조명을 다시 설정하고 재질을 편집하며 가상 객체를 사실적으로 삽입할 수 있습니다. 최근에는 딥러닝과 결합해 방사장에 반사율 및 조명 모델을 추가하는 방법이 많으며, 이는 더 넓은 신경 렌더링 분야에 속합니다.
에셋 캡처, AR, 시각 효과#
- 3D 에셋 캡처: 소매업체와 게임 스튜디오는 실제 제품을 스캔해 색상, 거칠기, 표면 법선 맵이 분리된 3D 에셋으로 변환합니다. 이를 통해 스토어 페이지나 게임 엔진에서 어떤 조명 아래에서도 모델을 올바르게 렌더링할 수 있습니다.
- 증강 현실: Google ARCore와 같은 AR 프레임워크는 카메라 피드에서 실내 조명을 추정하여 가상 객체에 어울리는 셰이딩, 그림자, 반사를 적용합니다.
- 시각 효과: Paul Debevec과 동료들이 2000년에 도입한 라이트 스테이지 장비는 다양한 조명 방향에서 배우의 얼굴을 촬영해 반사율을 복원합니다. 이를 통해 스튜디오는 디지털 얼굴의 조명을 임의의 장면에 맞출 수 있습니다.










