Quick Flow
camera sample
-> closest hit
-> direct-light sample + BSDF sample
-> throughput 갱신
-> 다음 bounce 또는 종료
-> sample 평균, temporal accumulation, denoise| 용어 | 바로 확인할 값 | 값이 나쁘면 |
|---|---|---|
| Sample per pixel | 프레임당 sample 수와 누적 frame 수 | 밝은 점과 flicker가 남음 |
| Throughput | 현재 경로가 운반하는 에너지 비율 | PDF를 빼먹으면 화면이 과하게 밝거나 어두워짐 |
| 그 방향을 뽑을 확률 밀도 | 낮은 확률의 결과가 폭발적으로 noisy해짐 | |
| Direct-light sampling | light를 별도로 한 번 샘플하는지 | 작은 light와 hard shadow에 noise가 집중됨 |
| Denoiser guide | depth, normal, albedo, motion vector | 움직일 때 ghosting 또는 세부 묘사 손실 |
한 sample이 계산되는 방식
path tracing은 픽셀마다 가능한 빛 경로 하나를 무작위로 추정하고, 그 결과의 평균으로 적분을 근사합니다. 다음 방향을 단순히 골라 더하는 것이 아니라, 그 방향을 뽑은 확률로 나누어 편향 없이 보정합니다.
Color L = 0;
Color beta = 1;
for (int bounce = 0; bounce < maxBounces; ++bounce) {
Hit hit = trace(ray);
if (!hit) { L += beta * sampleEnvironment(ray); break; }
L += beta * sampleDirectLightMIS(hit); // light PDF와 BSDF PDF를 함께 고려
Sample s = sampleBSDF(hit, rng);
beta *= s.f * abs(dot(hit.normal, s.direction)) / s.pdf;
ray = Ray(hit.position, s.direction);
if (terminateByRussianRoulette(beta, rng)) { break; }
}beta는 앞선 bounce까지의 BRDF, cosine, PDF 보정을 가진 throughput입니다. sampleDirectLightMIS는 light를 직접 뽑는 next event estimation과 BSDF 방향 샘플을 함께 쓸 때 쓰는 자리입니다. 같은 경로를 두 전략이 모두 만들 수 있으므로, multiple importance sampling으로 두 PDF의 기여를 조절하지 않으면 중복 계산 또는 높은 분산이 생길 수 있습니다.
Russian roulette은 충분히 깊어진 경로를 확률적으로 끝내는 방식입니다. 종료하지 않을 때 throughput을 생존 확률로 보정해야 평균 밝기가 유지됩니다. 단순히 일정 bounce에서 무조건 끊는 maxBounces는 비용 상한을 정하지만, 긴 간접광을 잘라 어두운 편향을 만들 수 있습니다.
누적과 denoising
| 상태 변화 | 누적 history 처리 | 이유 |
|---|---|---|
| 카메라 cut, FOV 변경, 해상도 변경 | reset | 이전 픽셀이 같은 표면을 가리키지 않음 |
| object transform 또는 skinned mesh 변경 | motion vector로 reproject 후 validity 검사 | 잘못된 surface history는 잔상을 만듦 |
| material, light, exposure 변경 | 보통 reset 또는 강한 history 감쇠 | 이전 sample의 분포와 목표 값이 달라짐 |
| normal/depth 불연속 | history 거부 | 다른 물체의 색이 번지는 것을 막음 |
denoiser는 noise를 없애는 별도 정답 계산기가 아닙니다. 현재 sample, history, guide buffer를 보고 비슷한 표면끼리 평균내는 추정기입니다. 특히 specular 반사, 미세한 geometry, 빠른 조명 변화는 history가 틀렸을 때 blur나 ghosting으로 쉽게 바뀝니다. accumulation 전후 중 어느 단계에서 exposure와 tone mapping을 적용하는지도 고정해야 합니다. 누적은 선형 HDR radiance에서 하고, display 변환은 그 뒤에 둡니다.
품질을 읽는 법
| 증상 | 먼저 확인할 원인 | 조치 |
|---|---|---|
| 작은 빛 주변의 점 noise | direct-light sampling 또는 light PDF 부재 | next event estimation과 MIS를 추가 또는 점검 |
| glossy 반사가 반짝임 | rough lobe sampling과 sample 수 부족 | BRDF importance sampling, temporal sample |
| 움직일 때 꼬리 | motion vector, disocclusion, history weight | reprojection validity를 강화하고 history를 줄임 |
| 세부가 뭉개짐 | denoiser radius 또는 guide 불일치 | normal/albedo guide와 필터 강도를 점검 |
| 화면이 점점 밝아지거나 어두워짐 | PDF, throughput, exposure를 중복 적용 | 한 sample의 estimator와 accumulation 단위를 분리 |
sample 수를 올리기 전에 noise가 어느 경로에서 생기는지 측정해야 합니다. 모든 픽셀에 같은 sample을 더하는 것보다, variance가 큰 영역에 sample을 배분하거나 light/BSDF sampling을 바로잡는 편이 더 큰 효과를 낼 수 있습니다.
참고 링크
1 sources