화이트 퍼너스 테스트
(lousodrome.net)- 균일한 환경광에서는 100% 반사 물체가 배경과 구분되지 않아야 하며, 이 성질로 렌더러의 물리적 일관성을 빠르게 검증할 수 있음
- 무광, 거울, 그 중간 재질이라도 완전 반사이고 균일하게 비춰지면 환경과 동일하게 보여 사라진 것처럼 보여야 함
- 신선한 눈은 알베도가 90~98% 까지 올라갈 수 있어, 흐린 날씨나 안개와 만나면 하늘과 눈이 구분되지 않는 화이트아웃이 생길 수 있음
- 이 테스트는 BRDF가 에너지를 잃거나 만들어내지 않는지 확인하며, 회색 환경에서는 과도한 반사 에너지가 더 밝게 드러나 오류를 찾기 쉬움
- 순백 Lambertian BRDF는 단순하고 에너지 보존이 명확해, 샘플링 분포·가중치·PDF·π 또는 2 계수 누락 같은 통합 버그를 드러내는 기본 점검으로 유용함
균일한 빛에서 물체가 사라져야 하는 이유
- 100% 반사 물체가 균일한 환경으로 비춰지면 물체는 배경과 구분되지 않아야 함
- 이 성질은 물체가 무광인지, 거울처럼 반사하는지, 또는 그 사이 재질인지와 무관함
- 렌더링 결과에서 물체가 보이지 않는다면 수학적으로 기대한 결과와 맞는다는 신호가 됨
현실의 비슷한 사례: 화이트아웃
- 신선한 눈은 알베도가 90~98% 까지 높아 거의 완전한 흰색에 가까울 수 있음
- 흐린 날씨나 안개가 겹치면 눈과 하늘이 구분되지 않는 화이트아웃 상태가 생김
- 이때 모든 방향이 균일한 흰색처럼 보여, 바로 앞 경사도 눈으로 구분하기 어려울 수 있음
BRDF의 에너지 보존 확인
- 화이트 퍼너스 테스트는 BRDF가 에너지 보존을 만족하는지 확인하는 데 자주 쓰임
- 반사 과정에서 에너지가 사라지거나 새로 생기지 않는지 확인하는 것이 핵심임
- 예를 들어 거칠기(roughness)가 증가할 때 재질이 더 어둡게 보이는 문제나, 상호 반사가 무시하기 어려운 수준이 되는 상황을 확인할 수 있음
- 흰색 환경뿐 아니라 회색 환경도 유용함
- 반사 에너지가 과도하면 주변보다 더 밝게 나타나 오류가 드러남
렌더러 통합 구현을 점검하는 방법
- BRDF 자체뿐 아니라 렌더러의 통합 부분을 점검할 때도 화이트 퍼너스 테스트가 효과적임
- 알베도 100%의 Lambertian BRDF는 에너지 보존이 완전하고 구현도 단순해, 렌더러 구현 버그를 드러내기 좋음
- 문제가 생길 수 있는 지점은 여러 곳임
- 샘플링 분포
- 샘플 가중치
- PDF 계산
- π 또는 2 같은 계수 누락
- 이런 오류는 결과 이미지가 여전히 그럴듯해 보일 수 있어 찾기 어려움
실패 예시와 디버깅 활용
- path tracer나 그 변형을 작성하거나, pre-convolved environment map을 만들거나, 다른 샘플링 분포를 시험할 때 순백 Lambertian BRDF로 먼저 화이트 퍼너스 테스트를 통과시키는 방식이 유용함
- 이 단계를 통과하면 구현을 어느 정도 신뢰한 뒤 BRDF 자체를 테스트할 수 있음
- Hacker News 댓글 이후 ShaderToy 예제에는 테스트 실패를 볼 수 있는
SIMULATE_INCORRECT_INTEGRATION매크로가 추가됨 - 이 매크로는 반구 적분이 2π에 해당한다는 점을 잊거나 샘플링 분포를 고려하지 않는 식의 잘못된 통합 버그를 흉내 냄
- 버그가 활성화되면 구가 올바른 양의 에너지를 반사하지 못해 화면에서 보이게 됨
댓글과 토론
Hacker News 의견들
-
최근 learnopengl의 PBR 튜토리얼을 따라 물리 기반 렌더러(PBR) 를 구현했는데, 화이트 퍼니스 테스트를 통과하지 못했음
그 덕분에 내가 구현한 수학을 별로 이해하지 못했다는 걸 깨달았고, 글쓴이가 말한 대로 π나 2를 임의로 곱하는 식으로는 맞아떨어지지 않았음- 지금까지 본 대부분의 BRDF는 글에서 말한 것처럼 거칠기가 커질수록 더 어두워짐
BRDF가 되는 법선 분포를 이루는 이론적 미세면 사이의 상호 반사를 고려하는 모델도 있고 더 낫긴 하지만, 그것들조차 이 테스트를 그대로 통과하는지는 확신하기 어려움
실제로 널리 쓰이는 것들은 대부분 에너지를 잃고, 이를 보정하려고 BRDF 위에 조회 테이블을 얹어 쓰는 경우도 있었음
- 지금까지 본 대부분의 BRDF는 글에서 말한 것처럼 거칠기가 커질수록 더 어두워짐
-
HN 상단에 이 글이 올라온 게 신기함. 실제로는 퍼니스 테스트가 두 가지 있고, 다른 하나는 0.5 발광과 0.5 알베도 조건에서 결과가 노이즈 픽셀 오차를 제외하고 1.0이 나와야 하는 테스트임
- 레이 트레이싱은 정말 최소한만 아는데도 글을 따라갈 수 있었음. 글이 명확하고 흥미롭게 잘 쓰였음
-
오래전에 https://graphics.stanford.edu/~boulos/papers/brdftog.pdf에서 에너지 보존과 데이터 재현성을 맞바꾸되, 그 대가로 상호성을 포기하는 시도를 했음
결국 BRDF에서 재질 데이터를 자동으로 맞추는 데는 아무도 크게 신경 쓰지 않았고, 관심이 있더라도 대칭적이고 충분히 보존적인 BSDF를 더 선호했음
이후 연구도 대부분 그쪽을 개선했고, 특히 대칭성을 깨면 양방향 경로 추적 같은 기법이 꽤 이상해짐 -
테스트 이름에 왜 furnace가 들어가는지 궁금함. 전체 개념은 이해되지만 이름이 꽤 임의적으로 느껴지는데, 근거가 있는 이름인지 궁금함
- 고전적인 흑체 복사 실험이 오븐, 가마, 화로를 사용한 데서 온 이름임
여기서도 개념은 비슷해서, 물체가 균일한 방출 스펙트럼을 가진 공동 안에 갇혀 있음. 다만 이 경우는 흑체가 아니라 흰색임 - 뜨거운 화로 내부가 테스트에서 시뮬레이션하는 것처럼 균일한 조명으로 빛나기 때문임
- 균일하게 흰빛이 비치는 환경 안에 있는 상황을 보는 테스트라서, 아주 뜨거운 화로 같은 이미지를 떠올리게 하는 기억 보조용 이름에 가까움
- 고전적인 흑체 복사 실험이 오븐, 가마, 화로를 사용한 데서 온 이름임
-
마침 며칠 전 YouTube 추천에 이 주제를 다루는 영상이 떴는데, 예정된 Blender 4.0 릴리스의 내용이었음
BSDF에 새 Multiscatter GGX 함수가 들어가며, 훨씬 깊게 들어가고 예시도 많이 보여줌
https://www.youtube.com/watch?v=v6qXbV_Q7z4 -
임베드된 ShaderToy가 원래 어떻게 보여야 하는지 모르겠음. 재생을 누르고 기다려도 1분 넘게 아무 일도 일어나지 않음
실패한 테스트 스크린샷 몇 장만 있어도 글이 훨씬 좋아질 것 같음- 처음엔 회색으로 시작하고, 구의 윤곽이 보인 뒤 배경이 페이드인됨. 빨간 구, 파란 구, 흰 구가 중앙의 회색/흰색 구 주변에 나타났다가 장면이 다시 회색으로 사라짐
이후 빨간 구와 파란 구가 다시 나오고 중앙 구에 반사 같은 것이 보이지만, 중앙 구가 배경에 “녹아들어서” 구인지 알아보기 어렵게 됨 - WebGL이 필요할 것 같음. 브라우저에서 WebGL이 켜져 있는지 확인해볼 수 있음?
- 처음엔 회색으로 시작하고, 구의 윤곽이 보인 뒤 배경이 페이드인됨. 빨간 구, 파란 구, 흰 구가 중앙의 회색/흰색 구 주변에 나타났다가 장면이 다시 회색으로 사라짐