Path-tracing 도중 path-faeture 추출하기

Theme
Mitsuba
연구
Type
테마글
Status
Post
분야
중요도
2 more properties
이미 앞선 두개의 포스트에서 path-tracer를 작성하고 pixel-wise그리고 sample-wise feature를 어떻게 뽑아 저장할 수 있는지를 다루어서 path-feature의 추출은 비교적 쉽게 진행할 수 있었다. 다만, Mitsuba3가 보편적인 렌더러가 아닌 연구용, 특히 differentiable rendering(path tracing)을 위한 연구이다보니 내가 나중에 c++로 만들어야 하는 기능들도 있다. 이번 포스트에서는 이에 관한 이야기도 해볼 예정이다.
Path-feature를 뽑는 방법은 각 surfaceinteraction의 반성 성질을 뽑는 것이다. 다만, geometric feature와는 다르게 연구가 덜 된 path-feature는 논문마다 추출하는 정보와 활용 방식이 다르다. 필자는 여러 연구의 디노이징 모델을 학습해보기 위해 현존하는 path-feature들을 모두 추출해볼 예정이다. 그래서 아래와 같이 추출해야 하는 path-feature들을 정리해보았다. 체크가 된 것들은 현재 올라간 github에 반영된 feature들이다.
Light Direction (only BSDF sampling) [SBMC]
Log-probability of BSDF & Direct light sampling [SBMC]
Visibility of first and second bounce [SBMC]
Sub-pixel coordinates [SBMC, NDLE]
Material interaction tag [SBMC, WCMC]
Light transport covariance (each sample & path) [PathMCD]
Incoming light direction (NEE) [PathMCD]
Attenuation [WCMC]
roughness [WCMC]
radiance undivided by sampling probability [WCMC]
Photon energy [WCMC]
Aggregate sampling probabilities [WCMC]
When using lens, not pinhole camera [SBMC, NDLE]
여기서 pinhole camera (혹은 perspective camera)를 사용하지 않고 thin lens를 사용하여 얻는 feature들은 제일 나중에 처리할 계획이다. 각각의 feature들의 의미는 아래의 논문들을 확인하기 바란다.
그리고 path-feature들은 각 intersection마다 feature를 뽑아야 한다. 그렇기에 기존보다 더 많은 aov 메모리를 할당해주어야 한다. 이를 위해서 integrator에 “direction_bounce:2f” 라는 정보를 줄 때 init단계에서 이를 주어진 max_bounce에 맞게(6이라고 가정하자) “direction_b02f”, “direction_b1:2f”, … , “direction_b5:2f”로 파싱하여 Mitsuba3가 이에 맞게 메모리를 할당할 수 있도록 하였다.
그 이후에는 기존처럼 필요한 feature들을 Integrator()클래스의 sample()함수에서 뽑을 수 있도록 하였다. 그 과정에서 겪은 디테일한 좌충우돌은 아래의 토글을 열면 확인할 수 있다.
local coordinates, camera coordinates, world coordinates
해당 기능을 짜면서 겪었던 재미있는 문제는, 뽑는 feature가 float기준으로 76 채널 이상을 뽑게 되는 순간 알 수 없는 에러가 아래와 같이 뜬다는 것이다.
(mitsuba) kyubeom@793f1e47e7e1:~/mitsuba3_playground$ python integrators.py ['normal:3f', 'depth:1f', 'albedo:3f', 'normal_diff:3f', 'depth_diff:1f', 'albedo_diff:3f', 'visibility_b0:1f', 'visibility_b1:1f', 'direction_b0:2f', 'direction_b1:2f', 'direction_b2:2f', 'direction_b3:2f', 'direction_b4:2f', 'direction_b5:2f', 'probability_b0:4f', 'probability_b1:4f', 'probability_b2:4f', 'probability_b3:4f', 'probability_b4:4f', 'probability_b5:4f', 'material_b0:1i', 'material_b1:1i', 'material_b2:1i', 'material_b3:1i', 'material_b4:1i', 'material_b5:1i', 'throughput_b0:3f', 'throughput_b1:3f', 'throughput_b2:3f', 'throughput_b3:3f', 'throughput_b4:3f', 'throughput_b5:3f'] Critical Dr.Jit compiler failure: jit_var(r3215): unknown variable! Aborted (core dumped)
Bash
복사
이를 Mitsuba3 git dicussion에서 물어보니, 현재 pip로 올린 빌드가 이상하여 github 코드를 직접 클론하여 설치한다면 해결된다고 하였다. 정확한 문제가 무엇인지는 알 수 없다고 한다. 역시 대학원생들과 몇명의 개발자들의 모든 것을 관리하기 힘든 모양이다. 그래도 몇시간만에 답해주시는 고마운 분들이다.
마지막으로 또 재미있는 발견을 이야기하고자 한다. 바로 현재 Mitsuba3의 bsdf() 클래스는 roughness를 얻는 함수를 지원하지 않는다는 것이다. 이게 또 특정 BSDF를 구현하는대에 roughness라는 상수가 들어가지만(Microfacet surface의 refraction 분포를 결정하는 상수, Walter et al.) 각 BSDF의 roughness를 return하는 함수가 없다(?). 이런 간단한 함수를 PR해달라고 하니 이분들은 만들 생각이 없는 것 같다. Roughness는 light transport에 중요한 상수로 해당 기능은 필자는 필요한 기능이니 꼭 만들 예정이다.
위의 path feature들을 모두 얻도록 코드 작성 이후에는 scene parameter randomization을 해볼 예정이다. 해당 과정이 필요성과 과정은 다음 포스트에 적겠다.