Computer generated imagery can be encountered everywhere. Only recently it has been revealed that the photos used for catalogs and websites of the biggest furniture manufacturer, IKEA, are not real. They were generated using one of the most advanced commercially available ray tracers called V-Ray. For more information look here.
This motivated us to see how far we can push the renderer we created during the CG1 course. Therefore, our goal was to create the realistic depiction of pieces of furniture. The concept image is shown on the right.
We first started off by modeling the scene. Our scene contains about 900K polygons. All the objects were hand modeled using 3Ds Max 2020.
Then plethora of different materials were added such as metal, Lambertian, Phong and Cook-Torrance materials. In order to make object appear even more realistic, we also used both combine material as well as applied texturing and bump mapping.
At the end couple of area lights were added as well as the spot light in the lamp. We also give the lamp the glow effect to simulate its behavior in the real world.
In order to create realistic image, models used in the scene have high polygon count. All together the scene has around 900K polygons. To achieve freater realism, both complex lighting as well as many other features which you can find in "Features" section were used. Despite of the difficulty of the scene, our renderer was able to generate image with 512 samples in less than 17 minutes on AMD Threadripper 1950x.
OpenMP was used to parallelize the renderer. The achieved average speed up is 16X on AMD Threadripper 1950x. Implementation is placed in rt/renderer.cpp.
Optimized SAH BVH
Our Bounding Volume Hierarchy was heavily optimized for both building and traversing the tree. We achieved better structure by using Surface Area Heuristics (SAH) instead of more common Split-in-Middle heuristics. In order to make the process of building the tree faster, we used the binning approach, which dramatically speed up the building process while not deterioarating the quality of the tree. We also linearized our tree, and optimized it for the cache lines of the x64 CPU architecture. During testing the scene with 300K polygons our solution achieved 85% speed up compared to the standard Split-in-Middle solution. Code can be found in rt/groups/bvh.cpp.
Material modeling is crucial in order to achieve realism. Since most materials in the nature have characteristics of multiple material models used in computer graphics, we implemented the combined material, which incorporates those models linearly. We used this feature together with the Cook-Torrance material to give the floor more realistic look. Implementation can be found in rt/materials/combine.cpp.
In order to achieve even better realism we implemented Cook-Torrance BRDF, which is one of the most common microfacet BRDFs. Due to its intuitiveness we used the Blinn microfacet distribution. We used it together with the combined material to give the floor more realistic look. Code is placed in rt/materials/cook_torrance.cpp.
Depth of Field & Motion Blur
Realism can also be achieved by implementing camera that simulates the behavior of the real one. To that end we implemented the camera that can both simulate the Depth of Field, as well as the Motion Blur Effects. Since our scene is static we used suttle effect of Depth of Field to boost the realism. Implementation can be found in rt/cameras/dofperspective.cpp.
Our scene already contains 900K polygons. In order to reduce the amount of polygons used, we implemented bump mapping feature and simulated subtle effects, like wall pattern, without increasing the number of polygons. Code is placed in rt/primmod/bmap.cpp