Small volumetric path tracer

Started by
4 comments, last by D-POWER 11 years, 3 months ago

Hello people,

So I've been working for the last couple of days on a little volumetric path tracer, that is based on Kevin Beason's great smallpt. I added homogeneous media definable as a sphere surrounding the scene, and multiple scattering which enables interesting effects like volumetric caustics and volumetric shadows. I also implemented the Henyey-Greenstein phase function to test any scattering types (forward, backward, isotropic)

The results so far are pretty acceptable, though to me not satisfying yet. I suspect there is a bug somewhere in my code, given the fact that I implemented my code without relying too much on available papers, so I might have done something wrong...

The project is already hosted on github at the following url: https://github.com/D-POWER/smallvpt

I'm interested to see high quality images rendered with it, any volunteers?

Of course, any feedback is very welcome smile.png

Thank you

Advertisement

Ugh. Sorry, I don't like when code is written like that. I would rather readability than conciseness. That said, well done, it looks really good (and correct, as well)! Works perfectly under Linux. I am actually working on a similar concept myself, though it's far from ready.

However, I couldn't help but notice that it takes a crapload of samples to converge properly. Have you implemented importance sampling? There is a rather elegant way to do in volume rendering so if you use the probability distribution [eqn]k e^{-ks}[/eqn] as demonstrated in "Rendering Participating Media with Bidirectional Path Tracing" which I assume is your reference as well, it lets you let do direct light sampling just as you would in a conventional path tracer (which'll reduce variance considerably, assuming the volume is not too dense and the light source is sufficiently close, obviously). This might help improve performance a bit, if the lights are too small.

I've got some spare processor cycles, just ask me if you need something rendered I'll see what I can do (I can render 512 samples of the default scene in 1m40s, with 4 threads)

“If I understand the standard right it is legal and safe to do this but the resulting value could be anything.”

Hello Bacterius,

I totally agree with you that code readability is far more important than conciseness, however my aim here is to maintain the lowest number of LOC, in the spirit of smallpt, while retaining a minimum of clarity.

I didn't check the paper you cited (I'll read it as soon as I'm back home), but I'm already working on adding direct light sampling. It should speed things up a bit. However, the convergence rate is really slow now and any resistance is futile :D.

I'm using importance sampling quite a lot in my implementation, first to sample the vertices along the ray that are expected to have the largest contribution to a pixel; second, since I'm using path tracing, no exponential ray growth is allowed, so I'm using the contribution of multiple scattering as a hint to decide whether it is worth it to trace the "volume" ray further or just continue with normal path tracing.

I'm still not completely satisfied with the results that I currently have, so there is still a lot of work to be done (especially in the convergence part) before I can call this thing done. In the meantime, here is my latest test render:

foggy_cornell_box_bs_25000spp.png

Here, I tweaked some settings and tried to render a scene. It didn't come out quite right (way too much fog) but there's 200000 samples in 512x512, took about 14 hours.

1rxeo9.png

“If I understand the standard right it is legal and safe to do this but the resulting value could be anything.”

what's the rendering time for that image? it looks amazin, I love the scattering around the light source. I think it would be probably simple to add chromatic abbreviation, kinda like a prism effect, that way it could maybe look like a rainy place :)

really cool work, keep us/me updated :)

Okey, this is getting interesting. Bacterius, I'm currently working on a new version of smallvpt, with more correct scattering code. I have read "Rendering Participating Media with Bidirectional Path Tracing", and found so many good ideas that I could use to improve my code. The version currently on github doesn't work properly when the medium is too small, a fix should be commited soon, but I already like the render you posted, even though it looks a bit "weird", 200000spp is quite blink.png .

Cheers

This topic is closed to new replies.

Advertisement