# Assignment 4: Investigating Importance Sampling

## Due: Tuesday May 16th, 11:59PM

Questions? Need help? Post them on the Assignment4Discussion page so everyone else can see!

If you do wish to post a wiki page for this assignment (see handins instruction below), please add a link to your writeup on Assignment4Submission. Since there is very little coding to be done on this assignment, please give extra attention to the quality of the answers in your handin.

## Description

Rendering requires the computation of many different types of integrals. For example, in the last assignment we numerically integrated over the back element of the realistic camera lens to compute the irradiance indicent on each pixel of the camera's film. In this assignment integration is performed over the directions subtended by area and environmental light sources. As you are now well aware, the variance of a monte carlo estimator manifests itself as noise in a rendered image. Thus, when integrating a function, it is important to choose samples from the domain of integration such that variance in the integral estimate is minimized. **Importance sampling** is a variance reduction technique that draws samples using a distribution that is proportional to the value of the function over the domain. In this assignment you will explore various approaches for sampling irradiance on scene objects due to an infinite area light source (environment light) and explain when certain approaches are preferrable to others.

We are happy to inform you that this assignment is designed to be significantly shorter than Homework 2 and 3.

## Step 1: Background Reading

Read chapters 13 (especially 13.5), 14 (especially 14.3.4) and 15 (especially 15.6) in the pbrt book. This assignment will require a solid understanding of importance sampling, so please read the these chapters carefully.

Additionally, you may want to take a closer look at the Monte Carlo integration your performed in assignment 3. Read this document to see why.

**Notice that there is a typo in the MULTIPLE IMPORTANCE SAMPLING EQUATION on pbrt page 676.** The pbrt code `core/transport.cpp` is correct, the equation in the book is wrong. Instead of multiplying both summations by the factor `1/(nf + ng)` as given in the book, the first summation (sum over samples drawn from a pdf from f) should be scaled by `1/nf`. The second summation should be scaled by `1/ng`. A correction is posted on the pbrt Errata page.

## Step 2: Importance Sampling an Infinite Area Light

In the scenes we've rendered in this class so far, objects were lit using a small number of spotlight or area light sources. In the real world, light incident on an object comes not just from light emitters, but from all directions. One way of approximating this effect in pbrt is to use an environment light (**infinite area light** in pbrt), which is used to define light entering the scene from *all directions* due the surrounding environment. Environment lighting can greatly contribute to the realism and richness of your renderings, however, since computing environment lighting involves integrating incoming radiance over the entire hemisphere above a surface normal, in the worst case, Monte Carlo estimates are prone to be noisy, and require many samples to produce images of reasonable quality. In the scene below, images of the killeroo scene are rendered with 4, 8, and 128 samples per pixel.

Importance sampling the environment map can make an enormous difference in the quality of the rendered image. Both images below are rendered using the same number of samples. In the image below at left, samples are drawn from a cosine-weighted distribution centered about the normal of the surface being shaded (see lights/infinite.cpp). However, in the case of an infinite area light, we know the light's luminance ahead of time, and therefore we can use this information to perform better sampling. At right, samples are drawn using a distribution that is proportional to the luminance of the environment map (see lights/infinitesample.cpp).

**Question 1.** As an exercise, assume that you are given an environment map with luminance `L(phi, theta) = cos(theta)` when `theta < PI/2` and `L(phi, theta) = 0 otherwise`. Write down a pdf that could be used to sample the environment with respect to luminance. Use the inversion method to find expressions for `phi` and `theta` in terms of uniform random variables `x1` and `x2` so that a direction on the sphere is chosen randomly according to your pdf.

Note in contrived simple cases such as this, integrating the pdf analytically is possible. In practice, radiance from each direction `(phi, theta)` is defined by a position `(u,v)` in a texture map and to implement the inversion method, CDF must be computed numerically. This is precisely what is done by `lights/infinitesample.cpp`. Take the time to understand how this implementation works.

## Step 3: Multiple Importance Sampling

Please download this zip file containing a number of scenes.

When computing reflected surface radiance due to direct lighting, pbrt computes an estimate of the integral of incoming light over all directions modulated by the surface's BSDF. To improve the quality of this estimate, it is desirable to use importance sampling when choosing a direction in which to sample incident radiance. The integrand consists of two terms, one related to the surface BSDF and the second related to radiance from light sources, and pbrt samples incoming radiance by drawing samples according to pdfs associated with each of the terms. This technique is called multiple importance sampling (MIS). It is implemented in pbrt in the file `core/transport.cpp`.

1. We would like to you add support for a 'sample' parameter to the 'directlighting' integrator that allows you to select between using the default multiple importance sampling implementation, or sampling **only** according to either the pdf provided by the light or BSDF. Possible values of this string parameter are "bsdf", "light", and "mis". This parameter controls whether the samples are drawn from BSDF, light source, or both distributions. Set the default value to be "mis". When you disable MIS, make sure that your estimate of direct lighting remains unbiased. (How might you verify this?)

2. The scene `mis.pbrt` defines the scene that is shown on page 677 of pbrt. Render `mis.pbrt` with each of the 3 sampling schemes. You should get images similar those on page 677 in the textbook. Be sure that you render all scenes with the same number of samples (Careful: the number of samples specified in the .pbrt file may need to change to ensure that the same number of samples are taken when MIS is disabled).

**Question 2**. When sampling according to the BSDF, some regions of the checkboard are rendered with little noise, and in other regions noise is severe. Describe which is which, and explain with this occurs when sampling according to the BSDF.

**Question 3**. Provide a similar explanation for the results you see when sampling with respect to the light sources. Are the bad cases when sampling with respect to the BSDF the same as the bad cases when sampling with respect to the lights?

**Question 4**. The image produced using multiple importance sampling exhibits the least amount of noise. How does this approach solve the problems you discussed in Questions 2 and 3? Specifically, has does the weighting in multiple importance sampling mitigate pathological cases?

## Step 4: Exploring Importance Sampling in the Killeroo Scene

Before proceeding with this step, you'll need to build `lights/infinitesample.cpp` into a shared object called `infinitesample.dll`. You modify the project or Makefiles from assignment 3 to do this.

Render `killeroo_view1.pbrt` with `grace_latlong.exr` as the environment map texture using the following settings. This scene contains three killeroos, ranging in specularity from most specular at left to least specular at right. In front of the killeroos are a set of spheres also of varying specularity. Use a total of 16 lighting samples to compute direct the lighting estimate (note this may mean you specify a different number in your scene file when using MIS)

- BSDF only distribution
- Light only distribution (using infinitesample as the light)
- Using multiple importance sampling (with infinitesample as the light).

**Question 5**. Discuss parts of the image that look better when using BSDF sampling than when drawing samples from a pdf based on environment map luminance.

**Question 6**. Notice that overall, the image is less noisy when sampling using only the luminace pdf than when using multiple importance sampling. Is this also the case when rendering using the `skylight-sunset.exr` environment map? Explain what is going on here based on your understanding of how samples in `lights/infinitesample.cpp` are generated, and the content of the scene and the environment maps.

**Question 7**. We have seen that using environment map luminance as a pdf for importance sampling can significantly reduce the variance in rendered images. Is this always true? Describe a situation that this sampling strategy may not be as effective as the cosine-weighted sampling implemented in `lights/infinite.cpp`. Try and construct a scene that demonstrates this (only draw sampled using the light's pdf in this experiment, do not use MIS).

**Question 8**. `killeroo-view2.pbrt` places the camera on the other side of the killeroos. From this angle, variance in the part of the images containing the body of the killeroos is similar using all three sampling schemes. Why does this new choice of view result in the killeroos looking more similar?

## Handin Instructions

Please submit your answers to the questions in this assignment as well as your modifications to pbrt source files in a single zip file named `FirstnameLastname_assigment4.zip` via email to cs348b-spr0506-staff@lists.stanford.edu with the subject line "CS348B Assignment4". Your handin can be in pdf, plain text, or MS word format. Please do not post your answers on the wiki. However, feel free to make a wiki page displaying any additional images you create and a discussion of what you learned.

## Grading

This assignment is graded on a 4 point scale. Thoughtful (but brief) and correct answers to all questions on this assignment will receive 3 points, which is considered to be full credit. Two points or lower will be awarded for incorrect or imprecise answers. 4 points will be awarded for exceptionally clear answers or other interesting findings with the assignment.