夜の日本市

Rendering competition entry of team Amaura
by Tobias Dick and Anton Wittig
final rendered image

Concept

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.

Resolution

1920x1080
Faces

216.021
Light Sources

15
Samples

400
Render Time

3h 13min
CPU

i5-11400F
12 Threads

Scene

We composed our scene in Blender by mainly using freely available 3D models and modifying them to our needs. Additionally, we added some own models such as the crates, the ground and the grass. We planned the scene construction beforehand by drawing and conceptualizing our rough ideas. We wanted to create a long road with a view of the houses at the sides. With a small alley on one side of the road. We also wanted to focus the viewer on one central piece in the scene, which became the ramen stall. We placed the temple at the end of the road and used smaller objects to decorate the scene wherever we saw fit. Then, we used freely available textures to texture the entire scene, as most of the models we used came without their own textures. The materials were assigned in our own renderer, since the material formats that are provided by the Wavefront OBJ standard did not give us enough control over the material properties. Finally, we added three point-lights, a directional light, and multiple area lights to set the mood of our scene, and added an environment map to simulate a night sky.

Additional Features

Normal Mapping

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)

Normal Mapping:
Code location:
rt/materials/material(cooktorrance)
rt/solids/solid(triangle)
rt/integrators/recraytrace
Implemented by:
Anton Wittig
Smooth Triangles

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.

Smooth triangles:
Code location:
rt/solids/striangle
Implemented by:
Tobias Dick
Soft Point & Directional Lights

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.

Soft Lights:
Code location:
rt/lights/pointlight
rt/lights/directional
Implemented by:
Tobias Dick
Accelerations

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.

Code location:
rt/groups/bvh
rt/renderer
Implemented by:
Tobias Dick
Cook-Torrance BRDF

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.

Code location:
rt/materials/cooktorrance
Implemented by:
Tobias Dick

Third-Party Assets

Contact: Tobias Dick, Anton Wittig