The year is 1850. It's almost night. Today will be the first red moon since you moved to this town, but the sun has not fully set yet. You can see a few last drops of light on the horizon in the distance. You left from your work at the rice field later than anyone else, thinking you will get a raise if you keep working overtime. But what you're seeing now surprises you. Not only is the owner of your favorite ramen stall not waiting for you, it seems like the whole town is empty. You can't find a single soul. Where is everyone? What will you do now? It is your decision to make, so choose wisely.
The concept of our image is the empty street of an old japanese village at dawn.
When reading the rules for the rendering competition, we very quickly agreed on creating an outdoor scene in an eastern setting. Initially, we were inspired
by nighttime photographs of side streets in modern japanese cities, with small, highly detailed buildings and neon lights. However, finding free 3D assets for our setting proved to be very difficult, so we transformed our scene into a
less modern setting, while still keeping our core concept.
To fake height differences in a surface one of the best ways is using normal mapping. By perturbing the normals at ray hit points a displaced surface can be simulated. The use of this can especially be seen on the walls of the buildings (see the image on the right)
rt/materials/material(cooktorrance)
rt/solids/solid(triangle)
rt/integrators/recraytrace
As the edge between neighboring triangles can be sharp depending on the angle between them and raise awareness to the single polygons, we introduce smooth triangles. For them the normal of a hit is the interpolation between the normal vectors assigned to the triangles points.
rt/solids/striangle
Normal point lights usually cast very sharp shadows, which is not realistic. To achieve higher realism we implemented soft point lights which cast smooth shadows.
As light coming from the sky is usually almost parallel it can be
simulated well by implementing a directional light.
rt/lights/pointlight
rt/lights/directional
To accelerate our code we implemented a binned Surface Area Heuristic for the construction of our BVH.
Additionally we activated multithreading using the openmp package to parallelize the raytracing.
rt/groups/bvh
rt/renderer
We decided to use a BRDF that is more realistic than the often used Phong BRDF, which is why we chose to implement the Cook-Torrance BRDF for our image. It also allowed us to use roughness maps, which are usually included with most textures.
rt/materials/cooktorrance