② One shortcoming of the current implementation of the
BSDF::Sample_f() method is that if some of the BxDFs make a
much larger contribution to the overall result than others, then uniformly
choosing among them to determine a sampling distribution may be
inefficient. Modify this method so that it instead chooses among the
BxDFs according to their relative reflectances. (Don’t forget to
also update BSDF::Pdf() to account for this change.) Can you create a contrived set of
parameters to a Material that causes this approach to be substantially
better than the built-in one? Does this change have a noticeable effect on
Monte Carlo efficiency for typical scenes?
① Fix the buggy Sphere::Sample() and Disk::Sample()
methods, which currently don’t properly account for partial spheres and
disks when they sample points on the surface. Create a scene that
demonstrates the error from the current implementations and for which your
solution is clearly an improvement.
② It is possible to derive a sampling method for cylinder
area light sources that only chooses points over the visible area as seen
from the receiving point, similar to the improved sphere sampling method in
this chapter (Gardner et al. 1987;
Zimmerman 1995). Learn more about these methods, or rederive
them yourself, and write a new implementation of Cylinder::Sample()
that implements such an algorithm. Verify that pbrt still generates
correct images with your method, and measure how much the improved version
reduces variance for a fixed number of samples taken. How much does it
improve efficiency? How do you explain any discrepancy between the amount
of reduction in variance and the amount of improvement in efficiency?
③ The sampling approach implemented in
InfiniteAreaLight::Sample_Li() is ineffective in scenes like indoor
environments, where many directions are occluded by the building
structure. One approach to this problem is to manually provide a
representation of portals like windows that the light passes
through. These portals can then be sampled by area to find paths that lead
to the light. However, such an approach doesn’t account for the
directional radiance distribution of the light source.
Bitterli et al. (2015) suggested an improved method that causes rectangular
portals to be rectangular areas in the environment map, which in turn can
be sampled directly. Implement their approach as a new
InfiniteAreaLight sampling method in pbrt, and measure the
improvement in efficiency for rendering scenes where there is a substantial
amount of occlusion between the part of the scene being rendered and the
infinite light source.
② The infinite area light importance sampling method
implemented in this chapter doesn’t perfectly match the distribution of the
light source’s emission distribution: recall that the emission function is
computed with bilinear interpolation among image samples, but the sampling
distribution is computed as a piecewise-constant function of a
slightly blurred version of the texture map. In some cases, this
discrepancy can lead to high variance when there are localized extremely
bright texels. (In the worst case, consider a source that has a very small
value at all texels except one, which is 10,000 times brighter than all of
the others.) In that case, the value of the function may be much higher
than predicted by the sampling PDFs at points very close to that sample,
thus leading to high variance
( is large).
Construct an environment map where this problem manifests itself in
pbrt and fix the system so that the excessive variance goes away. One
option is to modify the system so that the sampling distribution and the
illumination function match perfectly by point sampling the environment map
for lookups, rather than using bilinear filtering, though this can lead to
undesirable image artifacts in the environment map, especially when
directly visible from the camera. Can you find a way to only use the
point-sampled environment map for direct lighting calculations but to use
bilinear filtering for camera rays and rays that have only undergone
specular reflection?
The other alternative is to modify the sampling distribution so that it
matches the bilinearly filtered environment map values perfectly. Exact 2D
sampling distributions for bilinear functions can be computed, though
finding the sample value corresponding to a random variable is more
computationally expensive, requiring solving a quadratic equation. Can you
construct a scene where this overhead is worthwhile in return for the
resulting variance reduction?
② To further improve efficiency, Russian roulette can be
applied to skip tracing many of the shadow rays that make a low
contribution to the final image: to implement this approach, tentatively
compute the potential contribution of each shadow ray to the final overall
radiance value before tracing the ray. If the contribution is below some
threshold, apply Russian roulette to possibly skip tracing the ray. Recall
that Russian roulette always increases variance; when evaluating the
effectiveness of your implementation, you should consider its
efficiency—how long it takes to render an image at a particular
level of quality.
② Read Veach’s description of efficiency-optimized Russian
roulette, which adaptively chooses a threshold for applying Russian
roulette (Veach 1997; Section 10.4.1). Implement this algorithm in
pbrt, and evaluate its effectiveness in comparison to manually setting
these thresholds.
③ Implement a technique for generating samples from the
product of the light and BSDF distributions; see the papers by Burke et al. (2005), Cline et al. (2006), Clarberg et al. (2005), and Rousselle et al. (2008). Compare the effectiveness of
the approach you implement to the direct lighting calculation currently
implemented in pbrt. Investigate how scene complexity (and, thus, how
expensive shadow rays are to trace) affects the Monte Carlo efficiency of
the two techniques.
② Clarberg and Akenine-Möller (2008b) and Popov et al. (2013) both described algorithms that perform visibility caching,
computing, and interpolating information about light source visibility at
points in the scene. Implement one of these methods and use it to improve
the direct lighting calculation in pbrt. What sorts of scenes is it
particularly effective for? Are there scenes for which it doesn’t help?
② Investigate algorithms for rendering scenes with large
numbers of light sources: see, for example, the papers by Ward
(1991a), Shirley, Wang, and Zimmerman (1996),
and Donikian et al. (2006) on this
topic. Choose one of these approaches and implement it in pbrt. Run
experiments with a number of scenes to evaluate the effectiveness of the
approach that you implement.
③ Modify pbrt so that the user can flag certain objects in
the scene as being important sources of indirect lighting, and modify the
PathIntegrator to sample points on those surfaces according to
to generate some of the vertices in the paths it generates. Use
multiple importance sampling to compute weights for the path samples,
incorporating the probability that they would have been sampled both with
BSDF sampling and with this area sampling. How much can this approach
reduce variance and improve efficiency for scenes with substantial indirect
lighting? How much can it hurt if the user flags surfaces that actually
make little or no contribution or if multiple importance sampling isn’t
used? Investigate generalizations of this approach that learn which
objects are important sources of indirect lighting as rendering progresses
so that the user doesn’t need to supply this information ahead of time.