During the second year at ESIR, I made a ray tracing rendering engine with a co-worker. We developed it incrementally, starting from a simple ray tracing engine with Phong diffuse and specular colors to a path tracing engine with BRDF and real-time support. We developed it in C++.
During the third and last year at ESIR, I participated in an industrial project about image synthesis as well.
Here is three images of the same scene. One only by colors, the second with Phong shader and the last just adds a tweaky hack named soft shadow which is basically ambient.

A more complicated scene with emissive lightning, specular surfaces and textures. Naturally, we added acceleration structures to speed up the rendering, a
BVH
Bounding Volume Hierarchy coupled with an
SAH
Surface-Area Heuristic which we can see below, first without SAH, last with. Note how the bounding boxes better correlate with the scene geometry.

We then added indirect lightning, light surface, stratification of lights and pixels (to reduce variance between samples) and refraction. We also defined few more primitives such as spheres, annulus and cylinders to get perfect shapes. This engine embed a real-time visualizer thanks to upscaling, providing a more fluid camera. Hence, many features are toggled by keyboard.

We added realtime support in our application, which permitted us to debug and place components easily. It also helped to choose precisely rendering options. This real time feature achieve to have good performances thanks to an automatic decrease of the number of sent rays when moving the camera. The image will auto scale back to normal on stop, allowing an infinite number of passes and antialiasing.
Last year at ESIR embedded an industrial project proposed by an enterprise. The latter where I participated was proposed by Chaos Czech which develop the Corona Renderer. This project driven by four persons consists in implementing Optimal Multiple Importance Sampling in a bidirectional path tracer. It is also totally necessary to be unbiased. Here are presented the steps of the project, beginning with a small skill upgrading embedding Multiple Importance Sampling, Light Tracing and Bidirectional Path Tracing.
The MIS which was implemented using two sampling methods, the one of the BSDFs and the one of the lights that we can observe with 64 passes below respectively. The scene below is similar to the one proposed by Veach and Guibas, four spheres of color, four surfaces with more and more mate BSDFs. The last image corresponds to the weights determined by the balance heuristic.

Here are the renders of the same scene with a classic path tracer and the one with MIS. The last image is the subtraction of the two others to verify that there is no bias.

Here are the effects of the weights of each sampling method and the final result with 2048 passes (500s).

The BDPT is implemented with the balance heuristic. It allows complex paths like caustics to be traced which is necessary in some scenes. Here are successively Naive Path Tracing, Light Tracing and Bidirectional Path Tracing rendered with a high number of passes : 1024. The BDPT is the fusion of PT an LT in a sense that it computes all the possibilities of sampling a single path with these two techniques.
A path of 7 vertices can be sampled using 7 combinations, starting from [s=0;t=7] to [s=6;t=1] where s is the number of light vertices and t is the number of camera vertices (radiance and importance). The pdf of the current path with the current sampling is computed by studying all the other ways to sample this path by using forward and reverse pdf.

The complete minimization of Monte Carlo estimator variance with the releasing of the weighting constraint between 0 and 1 proposed by Kondapaneni et. al. led once again to a better variance minimization of rendered images. This method is based on the estimation of a linear system with de number of passes which permits to calculate the optimal weights to apply.

Two different sampling

Balance heuristic

Optimal weights

Our task was to implement this method in a BDPT.
To do this, the main contributions were :

The correction of some materials not computing the pdf in case of zero contribution

The correction of the microfacet's model that could generate negative pdf when computing the new normal

Taking into account Light Tracing paths

Taking into account zero contribution paths

This total integration gave very satisfying results in simple paths (direct lightning i.e. with an optimal sampling technique) but not with more complex path such as caustics.