Simple Path Tracer 짜기

Theme
Mitsuba
Type
테마글
Status
Post
분야
중요도
2 more properties
Mitsuba3는 Pbrt와 매우 유사한 구조를 가지고 있어 이를 따라가며 쉽게 이해할 수 있었다.
현재 path tracer의 implementation은 Mitsuba의 PathIntegrator()를 잘 살펴보면 이해할 수 있다. 우리가 이해하는 path tracer의 recursive loop이나 multiple importance sampling, next event estimation, termination을 위한 russian roulette에 대한 implementation은 모드 PathIntegrator()에 들어있다. 각 loop 마다 계산된 radiance는 HDRFilm()에 가서 다 merge되어 imageblock에 출력된다.
그러나 나의 최종 목표인 각 bouncing vertex마다의 feature을 추출하기 위해서는 Integrator딴의 수정이 필요하다. 그러나 integrator를 c++에서 새로 만들거나 기존 integrator를 수정하면 매번 새롭게 build를 하고 돌려보어야 한다는 단점이 존재한다. 그러나 Mitsuba3의 python binding은 Dr.Jit을 기반으로 하는 just-in-time compiling을 통해서 python으로 짠 코드도 mitsuba3에 컴파일하여 돌아갈 수 있도록 해준다. 이때의 장점은 매 수정마다 build를 해야 한다는 시간적 bottleneck이 사라졌다는 점과, 괴랄한 c++문법에 얽매이지 않고 코드를 작성할 수 있다는 것이다.
그러나 Dr.Jit기반의 python 코딩도 마냥 쉽지는 않았다. Dr.Jit는 ray tracing처럼 embrassingly parallel한, 혹은 differentiability가 필요한 프로그램을 위한 기능들을 가지고 있어 이를 제대로 이해하고 활용하지 않는다면 내가 짠 python 코드가 c++과 제대로 compile되지 않아 에러가 난다.
이러한 기능들에 익숙해지기 위해 우선 간단한 path tracer를 짜보았다. 현재 짠 path tracer는 매우 기본적인 기능들만을 담고 있어 Integrator.sample()함수만 작성하면 된다. 해당 코드는 아래 링크의 Simple()을 찾아보면 된다.
코드를 짜면서 신기하였던 것이 바로 configure loop state라는 것이다. 앞서 말했듯이 Dr.Jit는 parallel computing을 지원하기 위한 기능들을 제공하고, 이를 위해서 loop과 같은 다양한 기능들은 SIMD(Single Instruction Multiple Data)에 맞춰질 수 있도록 작성되어야 한다. 여기서, loop안에서 사용될 변수드르이 경우에는 미리 loop과 함께 아래에 정의해주어야 한다.
active = mi.Bool(True) ray = mi.Ray3f(ray_) depth = mi.UInt32(0) f = mi.Spectrum(1.) L = mi.Spectrum(0.) prev_si = dr.zeros(mi.SurfaceInteraction3f) # --------------------- Configure loop state ---------------------- loop = mi.Loop(name="Path Tracing", state=lambda: ( sampler, ray, depth, f, L, active, prev_si)) loop.set_max_iterations(self.max_depth)
Python
복사
또, 신기하게도, SIMD를 지원하기 위해 단순한 unsigned int를 선언하더라도 (1, N)크기의 array를 할당한다. 이는 multi-threading을 지원하기 위해 미리 array로 할당하여 같은 변수가 다른 thread에서 parallel하게 계산되도록 하기 위함으로 보인다. 앞으로 또 이와 같은 기능들에 익숙하지 않아 복잡한 렌더러 작성 시 많은 문제가 생길 것 같다.
그 다음으로는 Multiple Importance Sampling과 Next Event Estimation을 곁들인 Path tracer를 짜보고자 한다. 이 path tracer를 짜고 난다면 그 뒤로 feature extraction이 가능해질 것으로 보인다.