Computer Graphics/VulkanPT

pt - 10. NEE 계산 수정, svgf 디모듈레이션 수정, 필터에서 거울만 수정

surkim 2025. 5. 15. 10:38

Path Tracing에서 Next Event Estimation (NEE)  도입하면

직접광 샘플링과 BRDF 샘플링이 동시에 조명을 설명하게 되므로

Multiple Importance Sampling (MIS)  통해  샘플링 방식의 중복 기여를 보정해야 한다.

 

NEE 적용한 이후 직접광 샘플에 대해서는 MIS weight 올바르게 적용했지만

간접광 (BRDF 따라간 bounce)  대해서는 MIS weight 계산이 누락 것을 확인했다.

 

때문에 NEE를 추가했을때 MIS 보정이 들어가지 않아서 과하게 밝아지는 문제가 발생했던 것이다.

 

결과적으로 간접광만 누적한것과

NEE를 추가해서 누적한 이미지는 같아야하는데 (수렴속도만 차이나야하는데)

NEE를 추가하면서 과하게 밝아진 부분을 해결했다.

 

처음에는 밝아지는 게 맞다고 생각했어서 이 문제를 자각하지 못했다.

 

NEE 적용 전
NEE를 적용했지만 간접광에는 mis적용이 안된 이전 이미지
전부 적용
1: nee 적용전, 2: 잘못된 적용, 3: 제대로 적용 (1spp)

 

 

왼쪽: 샘플 수 많이 늘렸을 때, 오른쪽: 레퍼런스


 

svgf 디모듈레이션 수정

 

직접광, 간접광을 따로 샘플링하고 정확하게 알베도의 영향을 디모듈레이션 해줘야하는데

간접광 (brdf 따라간 bounce)샘플링은 재질 특성에 따라 확률적으로 디퓨즈, 스펙큘러중 하나를 선택해 적용하기 때문에 알베도를 제거하기가 쉬웠지만

 

직접광은 샘플링할 때

디퓨즈, 스펙큘러 혼합재질일 경우 한 샘플링 광원에 대해 각각 계산한 후 합해서 사용했었기 때문에

알베도를 정확하게 제거하기가 어려웠다.

따라서 간접광 계산할 때 처럼 재질 특성에 따라 확률적으로 디퓨즈, 스펙큘러를 하나 선택해 적용하는 것으로 바꿨고

디퓨즈일 때만 알베도를 디모듈 해주는 방식으로 바꿨다.

 

사실 이렇게 해도 NEE 샘플링자체가 간접광의 패스를 따라서 샘플링이 진행되기 때문에

2번째 바운스 이후부터는 직접광 누적에 간접광의 throughput이 들어가는 구조라

알베도의 영향을 전부 제거하지는 못했다.

그래도 영향도가 매우 낮아 이상한 색이 나오진 않는 거 같다.

 

또한 모듈레이션도 지금 그냥 알베도를 곱하는 형식으로 하고있는데 이러면

필터링된 디퓨즈 + 스펙큘러 영향에 그냥 albedo를 곱하는 형식이라

정확한 계산이 아닌거 같다.

 

정확하게 하려면 직접광의 디퓨즈 스펙큘러, 간접광의 디퓨즈 스펙큘러

싹 다 나눠서 디모듈 -> 필터링 -> 모듈레이션 해야 정확할 거 같은데

이러면 논문에 제시한 방법도 아니거니와

필터링 자체가 무거운데 그걸 두번 더 해야하는 거라

고민이 필요한거 같다..

 

고치기 전

 

고친 후

일단은 푸른빛 돌던게 사라졌다.

혼합재질에서 스펙큘러 부분이 거의 사라져버렸는데 이게 지금 잘 적용이 되서 이런건지

아니면 계산부분에서 누락된 부분이 있는건지 확인해봐야 할것 같다.


거울 재질 조정

씬의 4분의 1이 거울인데 흐릿하게 나와 안이쁜 것 같아서 이 부분만 조금 조정했다.

우선 흐릿하게 나오는 이유가 필터링 거칠 때 사용하는 인자들이

1. 표면의 법선벡터, 2. 뎁스, 3. 루미넌스 값인데

거울 재질에서 보이는 부분은 법선벡터와 뎁스차이가 거의 없으니깐

강한 필터링을 거치게 되어 생긴 문제

 

거울일 때만 gbuffer를 튕겨 보이는 부분의 정보로 바꿔서

선명하게 보이도록 바꿨다.

 


가까이 가면 전프레임에 있는 부분이었지만 갱신되는 부분은

일치도 검사할 때 depth차이에 대한 부분을 너무 강하게 잡아서 생긴 문제였고

약간 느슨하게 바꿔줘서 해결했다.