Graphics

Environment Map Importance Sampling

웹 기반 PathTracer 개발 중 발생한 노이즈 문제를 HDR 환경맵 Importance Sampling으로 개선한 사례를 소개합니다.

배경

엔닷라이트에서는 Surfee에서 사용자의 3D모델을 웹 환경에서 사실적으로 렌더링하기 위한 PathTracer를 개발하고 있습니다. 현대의 PathTracer는 물리적으로 정확한 라이팅 계산을 목표로 하지만, 샘플 수가 부족할 경우 최종 결과물에 노이즈가 심하게 발생하는 한계가 있습니다. Surfee팀도 개발중에 동일한 문제를 경험했는데요, 이를 해결하기 위해 저희는 HDR Environment Map에 Importance Sampling을 적용하여 샘플링 효율을 높이는 방식을 시도했고, 그 결과 노이즈를 크게 개선할 수 있었습니다. 이 글에서는 그래픽스 개발자뿐만 아니라 많은 분들이 쉽게 이해할 수 있도록 수식은 최소화하고 직관적인 예시로 설명해보겠습니다.


HDR Environment Map

Environment Mapping은 Scene 주변 조명을 표현하는 기법입니다. Scene을 둘러싼 구나 정육면체에 Environment Map 텍스처를 매핑하여 조명을 저장합니다. Environment Map을 사용하면 별도의 광원을 하나하나 조작하지 않아도 사실적인 라이팅을 연출할 수 있습니다.

Environment Map


Environment Map에는 LDR EnvMap과 HDR EnvMap가 있습니다. 두 EnvMap의 주요 차이점은, 저장할 수 있는 빛의 밝기 범위입니다. LDR EnvMap이 한 픽셀에 담을 수 있는 빛의 범위는 0~255까지이지만 HDR EnvMap은 32bit float형이므로 극단적으로 큰 빛도 저장할 수 있습니다. 따라서 HDR EnvMap을 사용하면 실제 세계의 매우 밝은 영역(태양, 조명)과 어두운 영역의 빛 차이를 정확히 구분해 표현할 수 있습니다.

HDR EnvMap과 LDR EnvMap의 픽셀 당 밝기 비교, What is a HDRI map?


이렇게 HDR EnvMap은 PathTracing에서 사실적인 조명을 빠르고 효율적으로 구현하는데 필요한 요소입니다. 그러나 HDR EnvMap을 그대로 PathTracer에 사용하면 LDR EnvMap을 사용했을 때보다 노이즈가 심해집니다. HDR EnvMap에서 대부분의 영역은 상대적으로 낮은 밝기를 가지고, 작은 영역(위 EnvMap에서 태양 부분)에서만 밝기가 매우 높습니다. 그렇기 때문에 샘플링 시, 이 작고 매우 밝은 영역을 PathTracer가 제대로 잡아내지 못해 노이즈가 심해지는 것입니다. 이제 HDR EnvMap을 효과적으로 샘플링하는 Importance Sampling 기법에 대해 살펴보겠습니다.


Importance Sampling

아래의 그래프를 보시면 f(x)는 샘플링 정답입니다. 그리고 pdf(x)는 각 샘플이 발생할 확률입니다. pdf(x) 그래프를 최대한 f(x)에 비슷하게 맞춘다면 노이즈가 줄어들게 됩니다. 오른쪽 그래프가 그런 형태입니다. 가운데 그래프는 모든 샘플이 동일한 확률로 샘플링되는 그래프입니다. 그래서 노이즈가 오른쪽 그래프보다 큽니다. 개선 전의 PathTracer가 바로 이런 샘플링 방식으로 동작하기 때문에 노이즈가 컸습니다. 그리고 마지막으로 왼쪽 그래프의 노이즈가 가장 클 것이라는 것을 예상할 수 있습니다. 중요한 빛은 조금 샘플링하고 중요하지 않은 빛은 많이 샘플링하기 때문입니다.

Efficient Monte Carlo Methods for Light Transport in Scattering Media, Wojciech Jarosz, Sep. 2008, Appendix A


Importance Sampling은 HDR EnvMap의 픽셀 중 밝은 픽셀의 빛에 더 큰 가중치를 주어 샘플링하도록 하는 방식입니다. 다시 말하면 오른쪽 그래프처럼 샘플링 확률을 f(x)에 맞추는 것입니다.

Importance Sampling은 두 종류가 있습니다. 첫 번째는 Ray가 최종 바운스까지 진행하여 EnvMap에 도달하였다면 결정된 Ray의 경로에서 Importance Sampling을 수행하는 방식입니다. 최종 바운스에만 Importance Sampling를 수행하므로 구현이 간단합니다.

두 번째는 매 바운스마다 광원을 직접 샘플링하여 Importance Sampling을 수행하는 방식입니다. 매 바운스마다 샘플링된 방향으로 ShadowRay를 쏘아 충돌 체크를 수행하여 광원을 반영하므로 계산량은 증가하지만 더 효과적으로 노이즈를 줄일 수 있습니다. 이 방식은 Next Event Estimation(NEE) 이라는 용어로도 불립니다. 두 Importance Sampling의 효과가 다르기 때문에 PathTracer에는 일반적으로 두 가지가 모두 적용됩니다. 여기서는 좀 더 복잡한 두 번째 Importance Sampling(NEE)에 대해 설명하겠습니다.

우선, Next Event Estimation을 수행하기 전에 EnvMap 픽셀 밝기를 반영하는 데이터를 만들어야 합니다.

  • Marginal PDF: EnvMap 각 행의 가중치

  • Conditional PDF: EnvMap 행이 선택됐을 때, 그 한 행의 열 가중치

  • Marginal CDF: EnvMap 각 행의 가중치 누적

  • Conditional CDF: EnvMap 행이 선택됐을 때, 그 행의 열 가중치 누적

PDF(Probability Density Function)는 연속적인 확률 변수가 어떤 값을 가질 확률을 나타내는 함수입니다. 확률은 항상 0 이상이어야 하고 모든 확률 변수의 확률을 더하면 1이 됩니다.

CDF(Cumulative Distribution Function)는 말그대로 특정 확률 변수까지의 확률 누적입니다. 그렇기 때문에 확률 변수가 어떤 값 x 이하를 가질 확률을 나타냅니다.


아래 그림의 격자는 예시로서 매우 단순한 EnvMap의 픽셀들을 보여주고 있고, 각 픽셀에는 빛의 세기가 담겨 있습니다 Marginal PDF/CDF는 EnvMap의 세로방향의 빛의 세기 가중치를 의미하고 Conditional PDF/CDF는 가로방향의 빛의 세기 가중치를 의미합니다.

먼저, Conditional PDF/CDF를 구하겠습니다. Conditional PDF/CDF는 EnvMap 행이 선택됐을 때, 그 한 행의 열 가중치이므로 EnvMap Width, Height 크기의 2차원 배열에 담깁니다. 각 행의 전체 픽셀을 더해 행 별 빛의 세기 합을 구합니다. 그리고 각 픽셀의 빛의 세기를 행 별 빛의 세기 합으로 나누면 각 픽셀의 확률(PDF)을 구할 수 있습니다. 각 픽셀의 확률을 왼쪽에서 오른쪽으로 누적하여 CDF도 구할 수 있습니다. 나머지 행들도 이 방식으로 동일하게 계산하면 됩니다.

Conditional PDF/CDF 계산


이제 Marginal PDF/CDF를 구하겠습니다. Marginal PDF/CDF는 EnvMap 행들끼리의 가중치를 담는 데이터이므로 EnvMap Height 길이 배열에 담깁니다. 위에서 이미 각 행들의 빛 세기 합을 구했습니다. 각 행의 빛 세기를 모든 행의 빛 세기의 합으로 나누어 Marginal PDF를 구합니다. 위에서부터 누적하여 CDF도 구합니다.

Marginal PDF/CDF 계산


이제 Importance Sampling을 수행할 준비가 끝났습니다. CDF 데이터를 활용하여 중요도가 큰 빛에 더 많이 샘플링되도록 하는 방법을
설명하겠습니다. Importance Sampling은 EnvMap의 행과 열 중 행을 먼저 처리합니다. 랜덤으로 뽑은 0.0~1.0 범위의 누적확률을 Marginal CDF에 보내서 EnvMap의 모든 행 중 가장 중요한 행을 찾는 겁니다. 이 부분이 매우 중요합니다.

좀 더 단순화하여 랜덤으로 목표 누적확률 0.1, 0.2, 0.3, 0.4, 0.5. 0.6 0.7, 0.8, 0.9, 1.0를 뽑았다고 가정해보겠습니다.
Marginal CDF를 이진 탐색하여 목표 누적확률보다 누적확률이 큰 첫 번째 인덱스를 찾습니다.

  • 0.1 → Index 0 (0.112)

  • 0.2 → Index 1 (0.25)

  • 0.3 → Index 2 (0.832)

  • 0.4 → Index 2 (0.832)

  • 0.5 → Index 2 (0.832)

  • 0.6 → Index 2 (0.832)

  • 0.7 → Index 2 (0.832)

  • 0.8 → Index 2 (0.832)

  • 0.9 → Index 3 (1)

  • 1.0 → Index 3 (1)

이진 탐색 결과, 총 10개 중 6개가 Index 2를 반환합니다. 이 말은 10번의 샘플링 중에 6번이 EnvMap의 2행으로 갔다는 의미입니다.
아래 그림의 빨간 화살표의 크기가 각 행의 중요도를 시각화한 것입니다. 열 방향에서도 동일한 방법으로 픽셀의 중요도를 계산하면 최종적으로 샘플링할 때 어떤 픽셀의 빛이 중요한지 알 수 있게 됩니다. 최종적으로 그 방향이 실제로 샘플링될 확률(PDF)를 구할 수 있습니다.

Importance Sampling


기존의 방식은 아래의 이미지처럼 EnvMap 픽셀을 무조건 랜덤으로 샘플링했습니다. 그렇기 때문에 각 픽셀의 빛 세기가 반영되지 않아 노이즈가 심했던 것입니다.

Uniform Sampling(기존 방식)


이제 실제 EnvMap에서 Marginal CDF와 Conditional CDF를 구해보겠습니다. 이 EnvMap은 세로 방향으로 보았을 때 가운데 지점에서 매우 강한 빛의 태양이 존재합니다. 따라서 Marginal CDF 시각화 이미지를 보면 중간 지점에서 CDF가 급격하게 증가한 것을 확인할 수 있습니다.


Multiple Importance Sampling(MIS)

Power Heuristic


위에서 EnvMap Importance Sampling을 수행하여 특정 방향이 실제로 샘플링될 확률(EnvMap PDF)를 구했습니다. 기존에 PathTracer에서 계산되고 있던 BSDF PDF와 EnvMap PDF를 MIS로 섞어줍니다. MIS는 여러 샘플링 전략을 결합해 각 샘플링의 장점을 살리고 단점을 보완하는 기법입니다. MIS에서는 일반적으로 아래의 Power Heuristic 공식을 사용합니다. 이 공식은 실험적으로 도출한 공식으로 BSDF 쪽이 유리한 경우는 BSDF 샘플이 많이 적용되고 EnvMap 쪽이 유리한 경우는 EnvMap 샘플이 많이 적용되는 결과를 얻을 수 있습니다.



적용 결과

모델 출처: Car Scene

모델 출처: Flight Helmet

모델 출처: Persus

이 이미지들은 Environment Map Importance Sampling 적용 전후(샘플수 32)를 비교한 것입니다. 세 개의 비교 이미지 모두 전체적으로 노이즈가 크게 개선된 것을 확인할 수 있습니다. 가운데 헬멧 이미지는 마스크 부분의 문양과 글자를 분명하게 인식할 수 있을 정도로 노이즈가 개선되었습니다. 그리고 오른쪽 조각상 이미지는 머리 위에서 내리쬐는 태양에 의한 그림자 또한 사실적으로 표현되었습니다. Environment Map Importance Sampling은 초기 가중치 계산과 NEE 수행을 위한 Scene Traversal 비용이 추가되지만, 그 이상의 품질 향상을 기대할 수 있습니다.




EnvMap Important Sampling 미적용

EnvMap Importance Sampling 적용

비고

spp 2

588.07

397.55

32.4% 감소

spp 4

396.40

217.09

45.23% 감소

spp 8

258.56

116.34

55% 감소

spp 16

159.55

61.19

61.65% 감소

spp 32

94.93

32.39

68.88% 감소

spp 64

54.99

17.07

68.96% 감소

spp 128

31.44

9.06

71.18% 감소

spp 256

18.39

4.94

73.14% 감소

spp 512

11.31

2.82

75.07% 감소

spp 1024

7.48

1.69

77.41% 감소

MSE 평균 62.89% 감소(2~1024 spp 구간)

MSE ≤ 20: 64 spp(MIS) ↔ 256 spp(No-MIS) → 4× 샘플 절감

MSE ≤ 10: 128 spp(MIS) ↔ 1024 spp(No-MIS) → 8× 샘플 절감



EnvMap Importance Sampling 적용 시 주의점

EnvMap Importance Sampling에는 초기에 픽셀 밝기 기반 가중치(CDF/PDF) 계산 비용이 추가되며, 또한 Point, Area, Spot light와 같은 개별 라이트는 EnvMap과는 다른 방식으로 Importance Sampling를 적용해야 합니다.



향후 과제

PathTracer의 품질을 향상시키기 위해 다음의 과제들을 단계적으로 진행할 계획입니다. 각 기법들은 모두 노이즈 감소를 목표로 합니다.

  • Adaptive Sampling: 이미지 전체를 균일한 샘플 수로 렌더링하지 않고 노이즈 정도에 따라 능동적으로 샘플 수를 조절하여 노이즈를 감소

  • Light MIS: 기존 Environment map의 MIS에 더해, 개별 조명에 대한 MIS

  • 저분산 Sampler: 샘플링 시 분산이 낮은 Sobol, Halton, Stratified, Blue Noise Sampler를 사용하여 노이즈를 감소

  • Manifold Next Event Estimation(MNEE): 굴절이 적용된 물체의 노이즈를 개선하는 목적



마치며

지금까지 PathTracer에 EnvMap Importance Sampling을 도입해 노이즈를 효과적으로 줄이는 전반적인 과정을 살펴보았습니다. 이 글을 통해 EnvMap Importance Sampling를 이해하는데 도움이 되셨다면 좋겠습니다. 앞으로도 PathTracer관련 흥미로운 주제를 공유하겠습니다. 그리고 이런 고민이 반영된 엔닷라이트 자체 PathTracer가 올 가을 Surfee에 탑재될 예정이니, 앞으로 많은 관심 부탁드립니다.


#

raytracing

#

pathtracing

#

importance sampling

#

graphics

함께 더 나은 협업문화를 만들어갈 동료를 기다립니다.

다른 글

ⓒ 2025 NDotLight Co., Ltd.

ⓒ 2025 NDotLight Co., Ltd.