#StackBounty: #raytracing #pathtracing #physically-based #global-illumination #monte-carlo Chart swaps and path inversion in bidirectio…

Bounty: 50

I’ve got a hard time to understand how we would implement the following in practice. I’d be great if someone could explain the details for the example below.


Assume we’re generating a path ${rm x}=(rm x_0,rm x_1,rm x_2)$ of length $2$ using the $(s,t)$-strategy in bidirectional path tracing (see picture below). Assume that there is no participating media in the scene and we’re using a pinhole camera.

Now assume $s=0$ and $t=3$. Since we’re using a pinhole camera, $rm x_0$ is deterministically fixed at the eye. A raster point is determined by drawing random numbers $u_1,u_2in(0,1)$ and mapping them uniformly to the raster space. The raster point determines a ray $r_1=(rm x_0,omega_1)$ with origin $rm x_0$ and direction $omega_1$. Assume that $r_1$ hits a surface point ${rm x_1}$. Now another pair of random numbers $u_3,u_4in(0,1)$ are drawn and mapped to a direction $omega_2$ by the$^1$ bidirectional scattering distribution function at $rm x_1$ and thereby giving rise to the next ray $r_2=(rm x_1,omega_2)$. $r_2$ might either hit another point $rm x_2$ (located on a surface or a light source) or escape the scene. In the last case, we assume that $rm x_2$ is located on an infinite light.

In summary, we’ve used the random numbers $u_1,u_2,u_3,u_4$ to sample $rm x=(rm x_0,rm x_1,rm x_2)$. Now assume we’re switching to the strategy. How can we determine random numbers $v_1,v_2,ldots$ which would have produced the same path $rm x$ under the $(1,2)$-strategy?

We should clearly be able to reuse $u_1,u_2$, since $(rm x_0,rm x_1)$ is still part of the truncated camera subpath of the $(1,2)$-strategy.

The abstract process is described in Section 6.1 of the paper Charted Metropolis Light Transport.

(s,t)-strategy


$^1$ It might actually be a composition of multiple BSDFs and $u_3$ is used to select one of it.

EDIT: I’m actually trying to implement this in PBRT. So, if necessary, feel free to assume that each BSDF has only a single component and that this component is of type (pbrt::BSDF_REFLECTION | pbrt::BSDF_DIFFUSE). Thus, you can assume that there is a single Lambertian BSDF at each surface point.


Get this bounty!!!

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.