본문 바로가기

카테고리 없음

2021.08.01 개발 일기 - 제대로된 NEE의 적용

이전까지 렌더러에 직접광과 관련된 기능을 추가하고 있었다. 이 부분을 책과 코드에만 의존해서 작성을 하다보니, 정확히 이해하지 못하고 잘못된 일을 하고 있었다.

 

우선 7월 29일날 작성한 일기에는 기존의 패스트레이싱의 방식이 잘못되었다고 작성했지만, 이는 잘못된 방식이 아니었다. 기존의 방식은 단순 BSDF 샘플링을 통해서 이미지를 만들어내는 것이기 때문에, 이미지의 분산이 높았을 뿐이었다. 이를 왜 잘못된 방식이라 생각한 이유는 PBRT 코드에서 패스트레이싱에 NEE(Next Event Estimation) 방식을 채용했고, 이로 인해 코드의 구조가 약간 달랐던 것이었다. 

 

Physically Based Rendering 책에는 이런 NEE에 대한 설명이 직접광에 대한 계산 설명 부분에 같이 들어있기 때문에, 이 부분을 놓치고 있었다.

 

이 부분에 대한 의문을 가지게 된 이유는 MIS(Multiple Importance Sampling)을 적용하기 위해서, 코드를 이것저것 수정하다가 문제를 발견하게 되었다. 책이나 인터넷에 검색을 해보면, MIS에 대한 예제 이미지로 아래와 같은 이미지를 쉽게 볼 수 있다. 

 

사진 1) Multiple Importance Sampling

 

이 이미지를 보면 광원 샘플링을 진행한 것과 BRDF 샘플링을 진행한 두 이미지가 있는데, 광원 샘플링까지는 당연히 NEE 단계에서의 광원을 샘플링해서 계산하는 것이라고는 이해했다.

 

하지만 BRDF 샘플링 부분을 잘못이해하고 있었다. 내가 이해하고 작업했던 것은 NEE 단계에서 광원만을 샘플링하다보면, 위 이미지와 같이 특정 상황에서 이미지의 분산이 높아지게 되기 때문에, NEE에서 BRDF 샘플링을 한번 더 진행하게 된다(PBRT 코드에서). 나는 여기서 말하는 BRDF 샘플링이 NEE 단계에서 일차적으로 교차한 점에서 한번 더 BRDF 샘플링을 한 결과에서 나온 기여치로만 이미지를 구성하면 그것이 BRDF 샘플링이라고 이해를 했지만, 사실 가장 기본적인 방식의 패스트레이싱(이전의 구현했던 방식)이 BRDF 샘플링이었던 것이었다.

 

이 부분을 완전히 잘못이해하고 있었다. 이 부분의 문제를 알게 된 것은 내가 갑자기 떠오른 것은 아니고, 이 부분에 대한 문제를 해결하기 위해서 인터넷을 뒤지고 있는 와중에, 이런 분야를 전문적으로 하는 일본인 프로그래머를 발견하고, 그 분이랑 연락을 해서 이미지에 대한 피드백과 NEE에 대한 간략한 설명 등을 해주었기 때문에, 문제를 빠르게 발견할 수 있었다. 

 

사진 2) 매우 친절한 일본인 프로그래머분

 

막히거나 궁금한 점이 있으면 언제든지 질문을 해달라고 한다. 사실 주변에 이쪽 분야를 하는 사람이 없었기 때문에, 아무런 피드백을 받지 못하고 혼자서 책을 읽고 논문 읽으면서 작업을 하다보니, 제대로 하고 있는지 모를때가 많았는데, 매우 잘된 것 같다! 

 

아무튼 이전에 내가 이해한 방식의 BSDF 샘플링의 이미지와 실제의 BSDF 샘플링의 차이는 아래와 같다.

사진 3) (1) 잘못이해한 BSDF 샘플링 (2) BSDF 샘플링

 

이전 방식의 이미지가 이렇게 어두운 이유는 교차점에서 Recursive한 방식으로 경로를 추적하는 것이 아니라 교차점에서 한번 BSDF 샘플링을 진행하고 충돌점에서의 픽셀 색상을 계산했기 때문이다. 

 

이 부분에 대해서 다시금 공부를 하고, 코드를 다시 수정했다. 이번에는 MIS를 적용하지 않고 NEE(Light Sampling)만을 적용한 다음에 렌더링을 했다. 결과는 이전의 잘못된 BSDF 샘플링보다는 나았지만, 최종적인 결과는 이상했다. 

 

사진 4) NEE(Lighe Sampling)로 렌더링한 이미지

 

자세히 보면 BSDF 샘플링으로 렌더링한 이미지는 가운데에 있는 Trasmission 반사 특성을 가진 구체의 밑에 Caustic 현상이 일어나고 있지만 NEE를 적용한 이미지에는 이러한 현상이 일어나지 않고 있다. 

 

정말 고맙게도, 일본인 프로그래머 분이 이 부분에 대해서도 피드백을 해주었다... Specular 특성을 가진 물체는 패스트레이싱 과정에서 특별한 처리를 해줘야할 것이라고 말해주었고, Specular 특성을 가진 물체를 처리해주는 코드를 추가해주고, 다시 렌더링을 하니 원하던 결과가 나왔다.

 

사진 5) 제대로 렌더링된 NEE 이미지

 

이미지의 분산이 눈에 띄게 줄어들었고, Caustic 현상도 문제없이 잘 처리되는 것을 볼 수가 있다. 

 

아무런 피드백을 받지 못했으면, 이 부분에 대해서 오랫동안 해결을 못했을 수도 있었다. 도움을 주신 분한테 너무 고마워서 스타벅스 기프트라도 보내드리려고 했는데, 내 카드로는 일본 스타벅스 기프트 카드를 결제할 수 없었다.. 다음에 기회가 되면 어떻게든 보답을 해야겠다.