
모든 렌더링은 이 렌더링 이퀘이션을 푸는 것으로 시작된다.
수식을 보면, 한지점에서 다른 지점으로 가는 빛의 총 양은 자발광과 다른곳에서 들어온 반사광의 총합으로 구성된다.
path tracing 역시 이 렌더링 이퀘이션을 자신만의 방법으로 풀어낸 것

렌더링 이퀘이션은 적분 항 안에
반사광이 다시 렌더링 이퀘이션을 참조하고 있고
즉 순환하는 적분식 구조를 가지며, 이를 해석적으로 직접 풀어내는 것은 불가능하다.
이 렌더링 이퀘이션은 뉴만 시리즈로 근사할 수 있는데
적분식을 K로 퉁쳐서 보면




식을 간단히 표현하면 빛의 총합은 무한히 반복되는 적분 항들의 합으로 표현된다.
이를 통해 한 점에서 다른 점으로 가는 빛의 총량을 무한 경로의 합으로 볼 수 있고
이 때 path tracing을 제안한 Kajiya은
모든 경로를 적분하는 대신 하나의 경로를 무작위로 선택해 근사하자는 접근을 제시했다.
여기서 중요한 점은, 하나의 경로만 선택하면,
실제 무한히 많은 경로의 총합을 근사해야 하기 때문에,
선택한 경로가 전체 적분을 대표하도록 확률적인 보정이 필요하다는 것
이 문제를 해결하기 위해,
Path Tracing은 Monte Carlo Integration 방식을 사용한다.
Monte Carlo Integration

몬테카를로 적분은 복잡한 적분식을 무작위 샘플로 근사하는 방법이다.
여기서 p(x)는 샘플링 확률밀도 함수인데
샘플링된 값들이 편향을 가지지 않게 하려면 샘플링 확률로 나눠야한다.
이 적분 방법을 렌더링 이퀘이션에 적용하면,


최종 radiance는 자발광에 입사방향을 무작위로 샘플링하여 평가한 기여도들을 평균낸 구조로 표현할 수 있다.
여기서 카메라가 처음 레이를 쏴서 화면에 찍히는 색상은 여러 번 샘플링하고 평균을 내서 결정하지만
그 이후 각 반사 바운스에서는 경로 하나만 무작위로 선택하고
그 경로 하나가 전체 적분을 대표하도록 처리하는 것이 바로 path tracing 이다.

그럼 경로 하나만을 생각을 해보면
경로를 따라가면서 레이가 표면에 부딪히면 그 지점에서 brdf를 평가해서 빛이 반사되는 강도와 반사될 확률을 계산한다.
이때 단순히 brdf만 곱하는 것이 아니라 입사방향과 표면 노말 사이의 각도를 고려해 코사인 보정을 추가로 곱해준다.
그리고 샘플링된 입사 방향이 선택된 확률, 즉 pdf로 나누어 공정한 평균을 만들어준다.

이 과정을 통해 얻은 '단계 기여도'를, 지금까지 경로를 따라오며 누적된 throughput에 곱해줍니다.
Throughput은 지금까지 이 경로를 따라오면서 얼마나 빛이 살아남았는가를 나타내는 계수이고
반사나 굴절이 발생할 때마다 BRDF와 코사인 보정, pdf 나눗셈을 거치면서 throughput은 점점 줄어들게 된다.
그렇게, 경로를 따라 표면마다 누적해서 곱해나가면서 최종적으로 광원을 만났을 때, 누적된 throughput과 광원의 방사 휘도(Le)를 곱해 픽셀 색상에 반영하게 된다.
표면에서 입사 방향을 무작위로 샘플링하더라도
렌더링 이퀘이션과 몬테카를로 적분에 의해 결국 결과는 수렴하지만
대부분의 방향은 기여도가 거의 없다.
무작위 샘플링을 하면 불필요한 방향도 똑같이 샘플링하게 되어
정확한 결과를 얻기까지 지나치게 많은 샘플이 필요하게 된다.


따라서 기여도가 높은 부분만 선택해서 샘플링하는 importance sampling기법을 사용한다.
이때 기여도가 높은 부분은 알고있는데 brdf가 그 정보를 제공한다.

brdf란 입사 광선이 주어졌을 때 출사 방향으로 반사되는 광선의 강도를 나타내는 비율 함수다.
따라서 brdf를 기반으로 샘플을 뽑으면, 실제로 큰 기여를 하는 방향을 더 자주 선택할 수 있다.
이 brdf 함수는 표면의 재질에 따라 달라지는데
완전히 매트한 표면은 디퓨즈 반사를 하고
거칠고 광택 있는 표면은 마이크로 패싯 모델을 따라 반사한다.
따라서 path tracing에서는 각 재질에 맞는 brdf를 사용하여 그 특성에 맞는 입사 방향을 집중적으로 샘플링한다.
다만 기여도가 높은 방향을 더 자주 샘플링하면 원래 렌더링 이퀘이션에 있는 균일한 적분 구조와는 달라지게 되어
샘플링된 방향의 확률로 나눠 보정하는 과정이 반드시 필요하다.
현재 프로젝트에서 사용한 brdf 모델은
디퓨즈 반사를 위한 람버시안 모델


람버시안 디퓨즈 모델은 모든 방향으로 동일하게 빛을 반사하며,
에너지 보존을 위해 반사율 ρ를 반구 면적 π로 나눈 값이 된다.
글로시/메탈릭 반사를 위한 ggx기반 microfacet모델


- D(h)는 하프벡터(h)의 분포 함수로, 거칠기에 따른 표면 분포
- F(ωi,h)는 프레넬 반사율로 입사 각도에 따른 반사량을 조정.
- G(ωi,ωo)는 표면의 마스킹/셰도잉 효과.
GGX 모델에서는 하프벡터를 중심으로 샘플링하며,
결과적으로 p(ωi)는 하프벡터 분포 D(h)와 입사 방향, 하프벡터 간의 각도를 고려한 형태로 계산된다.
각 brdf에 맞춰 입사 방향을 중요도 기반으로 샘플링하고
샘플링 확률을 이용해 기여도를 계산했다.
path tracing step
1. 카메라에서 레이를 발사. (초기 weight = 1)
2. 레이의 충돌 표면을 찾는다.
3-1. 이때 충돌 표면이 광원 이라면 weight * Le로 계산 후 종료.
3-2. 광원이 아니라면 재질 확인 후 brdf에 따라 중요도 기반 샘플링을 진행. 샘플링 확률에 따른 pdf도 계산.
4. weight를 갱신

5. 새 입사 방향으로 레이를 발사 -> step 2로 가서 반복.
현재 결과물


앞으로 방향성)
1. 스펙트럼 데이터 보정 문제
.pbrt 파일을 읽어오는 라이브러리를 직접 구현하지 않고 외부 라이브러리를 사용했는데,
이 파서에서 스펙트럼 → XYZ → RGB 변환이 잘못되어 받아오는 조명 데이터가 정확하지 않은 문제가 있다.
현재는 임시 보정을 통해 사용 중이며, 씬에서는
- 정면 조명 (6500K, 100) = 차가운 밝은 조명
- 천장 조명 (2700K, 10) = 따뜻하고 약한 조명
으로 설정되었지만,
제 렌더러에서는 천장 조명이 과하게 강조되어 레퍼런스보다 붉은 느낌이 난다.
정확한 스펙트럼 변환 및 보정을 통해 해결할 예정.
2. 샘플 중에 NaN 값 발생
- 렌더링 결과에서 일부 샘플에서 NaN 값이 발생하는 경우가 확인되었다.
→ Ray/BRDF 평가 및 weight 계산 시 수치 안정성 체크를 추가해 NaN 발생을 방지할 예정.

3. 샘플 카운트가 높아질수록 색상이 어두워지는 문제
- 샘플 수가 증가할수록 전체 씬이 점차 어두워지는 현상이 있다.
- 근본적으로, 샘플이 많아지면 특정 색상으로 수렴해야 할 것 같은데 수식에 오류가 있나 확인해봐야겠다.
'Computer Graphics > VulkanPT' 카테고리의 다른 글
| pt - 5. 광원 정규화, bloom 적용, NEE 적용 중 (0) | 2025.05.07 |
|---|---|
| pt - 4. 문제 해결 + blackbody 관련 정리 (0) | 2025.05.02 |
| pt - 2. 재질에 따른 brdf 공식 적용 (0) | 2025.04.29 |
| pt - 1. (.pbrt)파일 파싱과 나이브한 구현 (0) | 2025.04.28 |
| pt - 0. path tracing 렌더러 시작 (2) | 2025.04.25 |