The Chair

Rendering Competition - Computer Graphic 1

Concept

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.

Process

Rendering

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.

Features

Multithreading

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.

Combined Material

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.

Cook-Torrance Material

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.

Bump Mapping

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

Code & Models