Rendering
Digital Image Synthesis, Fall 2009

Jump to...

project #1
project #2
final project
assignments


project #3: Reflection Models

Assigned: 2009/11/26
Due: 2009/12/17

Project description

This project intends to get you familiar with pbrt's reflection models. In this project, you are asked to add plugins for Ward model and a data-driven reflection model to pbrt.

Ward's model. For the first part, please read this paper for Ward's model. There is also a note on Ward's paper. You might want to refer to this if you want to implement sampling for Ward's model. You need to implement full Ward's model, i.e., including the anisotropic one. I will suggest that you test your Ward's model implementation using spheres, such as spheres-aniso.pbrt.

Reflection models are parts of the pbrt core. To avoid modify the core, I would suggest that you add a source file ward.cpp for the material plug-in called ward. In the same file, add the source code for the BxDF class, Ward. In the ward material, you only add one BxDF, Ward. Thus, the material simply follows Ward's model. You can then include the material into the pbrt scene and adjust Ward's parameters through the ward material.

Below is a sample rendering of the Ward model without importance sampling. It was rendered with path tracing with depth=3 and 1024 samples per pixel. Notice that we did implement Sample_f and Pdf to check whether wi and wo are on the same side even though we did not do importance sampling (we did consine weighted sampling instead). The scene file can be found here. Note that the scene file used half size resolution only.


left: kd=(0.2, 0.2, 0.3), ks=(2.0, 2.0, 2.0), alpha_x=0.2, alpha_y=0.2
right kd=(0.3, 0.3, 0.0), ks=(1.4, 1.4, 1.4), alpha_x=0.5, alpha_y=0.1

Data-driven model. For the second part, we provide two reflection models measured by MERL, blue-rubber and green-metallic-paint, for this project. For reading these models, please refer to this file. You can use read_brdf() to read a BRDF file and use lookup_brdf_val() to find the corresponding value for a pair of incoming direction and outgoing direction. If you are interested in howthe reflection models were measured, please read this paper. For this project, you only need to implement the tabulated parameterization for data-driven reflection models. It treats the reflection model as a big 4D table.

For this plugin, I would suggest that you add a source file Tabulated.cpp for the material plug-in called Tabulated. In the same file, add the source code for the BxDF class, TabulatedBxDF. In the Tabulated material, you only add one BxDF, TabulatedBxDF. Thus, the material simply follows the data-driven model. We have provided a template file that you can base on. You can then include the material into the pbrt scene to test the data-driven model. We have provided a sample scene file that you can modify and use for testing your own materials. Noe that importance sampling is not required for this project.

Below is a sample rendering for the two materails without importance sampling. They were rendered with path tracing with depth=2 and 1024 samples per pixel.


The left is the tabulated material blue-rubber and the right is the tabulated green-metallic-paint.

Submission

You need to submit the source code files that you have created or modified, the scene files and a html report on what you have accomplished. The report should at least include two renderings for the scenes we provided, one for Ward and one for Tabulated. Refer to this article for submission instructions.

Reference