Features

Rendering Features

Area-Lights

Area-lights are a good way to provide more realistic lighting and soft shadows. We implemented area-lights by just uniformly sampling their area.
Below you can see what happens if we replace the spherical area-light by a point light.

With Area-Lights Without Area-Lights


Depth of Field

Implemented using the thinlens camera model. In this case it also has an effect on bloom.

With DOF Without DOF


Normal Mapping

Normal mapping is essentially a way to give surfaces a more complex appearance for free by disturbing the surface normal and introducing bumps and other features.

With Normal Mapping Without Normal Mapping


Alpha Mapping

Alpha mapping enables very fine details even for low-poly meshes, which is especially great for foliage.

With Alpha Mapping Without Alpha Mapping

Postprocessing Features

Denoising

Denoising aims to remove the noise from a rendered image. It also helps with fireflies.
We implemented denoising with the use of Intel's Open Image Denoising library. In addition to the normal integrator of the assignments, we implemented an albedo integrator to provide both normal and albedo input to the denoiser. This required Bsdfs to have an albedo method which computes the hemisperical reflectance. Both the normal and the albedo inputs are prefiltered, meaning denoised themselves, to further improve the denoising quality.
To better show the effect, the images below have been rendered with only 32spp.

With Denoising Without Denoising


Bloom

Bloom is implemented using the downsample-upsample+blur technique. We apply a naive threshold to the image before starting the operation.

With Bloom Without Bloom


AGX Tonemapping

The bloom ended up looking very different from blender's version. Some digging revealed that it was mostly due to the color transformation. Since the resulting image is an exr, it needs to be converted, and the standard linear to sRGB conversion is likely being used by most conversion tools. Thus, we do the conversion ourselves to get the desired look.
We use a polynomial approximation of AGX, which is not optimal, but it has a small MSE and was easy to implement.

With AGX Without AGX