Bidirectional Path Tracing
Sampling the integral for a point can be done by solely gathering from the surface, or by solely shooting rays from light sources. (1) Shooting rays from the light sources and creating paths in the scene. The path is cut off at a random number of bouncing steps and the resulting light is sent through the projected pixel on the output image. During rendering, billions of paths are created, and the output image is the mean of every pixel that received some contribution. (2) Gathering rays from a point on a surface. A ray is projected from the surface to the scene in a bouncing path that terminates when a light source is intersected. The light is then sent backwards through the path and to the output pixel. The creation of a single path is called a "sample". For a single point on a surface, approximately 800 samples (up to as many as 3 thousand samples) are taken. The final output of the pixel is the arithmetic mean of all those samples, not the sum.
Bidirectional Path Tracing combines both Shooting and Gathering in the same algorithm to obtain faster convergence of the integral. A shooting path and a gathering path are traced independently, and then the head of the shooting path is connected to the tail of the gathering path. The light is then attenuated at every bounce and back out into the pixel. This technique at first seems paradoxically slower, since for every gathering sample we additionally trace a whole shooting path. In practice however, the extra speed of convergence far outweighs any performance loss from the extra ray casts on the shooting side.
The following pseudocode is a procedure for performing naive path tracing. This function calculates a single sample of a pixel, where only the Gathering Path is considered.
Color TracePath(Ray r, depth) { if (depth == MaxDepth) { return Black; // Bounced enough times. } r.FindNearestObject; if (r.hitSomething == false) { return Black; // Nothing was hit. } Material m = r.thingHit->material; Color emittance = m.emittance; // Pick a random direction from here and keep going. Ray newRay; newRay.origin = r.pointWhereObjWasHit; newRay.direction = RandomUnitVectorInHemisphereOf(r.normalWhereObjWasHit); // This is NOT a cosine-weighted distribution! // Compute the BRDF for this ray (assuming Lambertian reflection) float cos_theta = DotProduct(newRay.direction, r.normalWhereObjWasHit); Color BDRF = m.reflectance * cos_theta; Color reflected = TracePath(newRay, depth + 1); // Apply the Rendering Equation here. return emittance + (BDRF * reflected); }
All these samples must then be averaged to obtain the output color. Note this method of always sampling a random ray in the normal's hemisphere only works well for perfectly diffuse surfaces. For other materials, one generally has to use importance-sampling, i.e. probabilistically select a new ray according to the BRDF's distribution. For instance, a perfectly specular (mirror) material would not work with the method above, as the probability of the new ray being the correct reflected ray - which is the only ray through which any radiance will be reflected - is zero. In these situations, one must divide the reflectance by the probability density function of the sampling scheme, as per Monte-Carlo integration (in the naive case above, there is no particular sampling scheme, so the PDF turns out to be 1).
There are other considerations to take into account to ensure conservation of energy. In particular, in the naive case, the reflectance of a diffuse BRDF must not exceed or the object will reflect more light than it receives (this however depends on the sampling scheme used, and can be difficult to get right).
Read more about this topic: Path Tracing
Famous quotes containing the words path and/or tracing:
“... my aim is now, as it has been for the past ten years, to make myself a true woman, one worthy of the name, and one who will unshrinkingly follow the path which God marks out, one whose aim is to do all of the good she can in the world and not be one of the delicate little dolls or the silly fools who make up the bulk of American women, slaves to society and fashion.”
—Ellen Henrietta Swallow Richards (18421911)
“Our life is a faint tracing on the surface of mystery, like the idle, curved tunnels of leaf miners on the face of a leaf. We must somehow take a wider view, look at the whole landscape, really see it, and describe whats going on here. Then we can at least wail the right question into the swaddling band of darkness, or, if it comes to that, choir the proper praise.”
—Annie Dillard (b. 1945)