Computer Graphics/VulkanPT

pt - 6. 푸른빛 해결, 안티 엘리어싱, 러시안룰렛 추가

surkim 2025. 5. 8. 10:57

1. NEE 이상 고침

 

샘플중 r 값만, (실질적으로 앞의 4bytes만) 0이 되어버려 전반적인 색이 푸르게 변하는 문제가 있었는데,

해결했다.

 

정확히 말하자면 .rgen 파일과 .rchit파일간 데이터를 raypayload 구조체로 주고 받는데

이 구조체가 참까다롭다.

명확한 레퍼런스는 결국 못찾아 확실하지 않은데

경험상 128bytes를 넘으면 예상하지 못한 에러가 난다.

이 에러가 정말 예상을 못하는게 명확한 에러가 나는게 아니라

부분적으로 특정 메모리 지역에 null이 채워진다 던가 하는 에러가 나서

원인 찾기가 쉽지가 않았다.

 

이제 BRDF 기반 경로 추적 과정에 Next Event Estimation(NEE)도입하여,
레이가 표면에 도달했을 광원을 샘플링해 직접광을 계산하고,
기여를 휴리스틱 밸런스를 통해 보정한 최종 radiance반영하도록 구현했다.

 

왼쪽: NEE 추가 전, 오른쪽: NEE 추가 후 (SPP 4096)

 

brdf기반으로 path tracing 과정에서

레이가 닿는 모든 표면에 대해 라이트를 샘플링 하는데

모든 라이트에 대해 기여를 전부 계산하지는 않고

 

현재 있는 모든 라이트를 삼각형 단위로 분해한

삼각형들 하나를 유니폼하게 선택하고
선택된 삼각형 내부에서 면적 기반 샘플링통해 점을 고르는 방식으로 구현했다.

 

샘플링된 위치가 현재 지점에서 가시적인 경우에만
BSDFgeometric term고려하여 직접광 기여를 계산하고
light pdf기반한 MIS 보정 radiance반영했다.

 

샘플 하나일 때 차이가 명확하다.

왼쪽: NEE 추가 전, 오른쪽: NEE 추가 후 (SPP 1)

 

2. 안티 엘리어싱

안티 앨리어싱은 복잡하게 처리하지 않고,
픽셀 중심 대신 랜덤한 서브픽셀 위치에서 ray쏘는 방식으로 간단히 해결

 

프레임마다 다른 위치에서 샘플링되기 때문에
프레임 누적으로 자연스럽게 aliasing줄어드는 효과얻을 있었다.

 

왼쪽: 안티 엘리어싱 적용 전, 오른쪽: 적용 후 (SPP 4096)
왼쪽: 안티 엘리어싱 적용 전, 오른쪽: 적용 후

 

3. 러시안 룰렛

 

3bounce 이후부터 경로를 무조건 이어가는 대신

throughput비례한 확률로 생존 여부를 결정하는 러시안 룰렛을 적용했다.

에너지 보존을 위해 살아남을 경우에는 기여를 1/p보정한다.

 

왼쪽: 러시안 룰렛 적용 전, 오른쪽: 적용 후