While brainstorming for a concept for our scene, we played with multiple very different ideas, but all of them had in common that the scene was supposed to be a realistic one. We ended up deciding on a setting that targets at representing a certain feeling rather than highlighting a particular element.
We wanted to create a cityscape like this as it reminds us of places we have seen during travels - so for us, this feeling is a mix of nostalgia, being overwhelmed by an unfamiliar place and the sensation of breathing fresh air when taking a calm walk at dawn in a city that is intentionally left unspecified.
We used Blender to create our models and arrange our scene. Even though we were total noobs (most likely still are), our goal was to use as few external models as possible, so we ended up modeling everything in the image on our own, except for the taxi car and the neon sign.
Naturally, our first models looked rather...simplistic. But you gotta start somewhere, right?
After quite some hours of trial and error and skipping through tutorials, we started the actual scene by modeling the street itself, adding more and more details to it and then putting the first textures on top.
We just had to add some buildings surrounding our street and there we had our first cute little city!
The scene was made more realistic by carefully mapping textures and googling the dimensions of completely ordinary objects we would walk past on a daily basis but somehow never paid attention to. We used mostly external textures (see sources) of which we modified some in order to make them fit better into our scene. Other textures (street sign, sky gradient) were designed by ourselves.
Finally, the details started to look right: Our street lights did not look like shower heads anymore, the ratios of object sizes were not so off and the buildings in the background had windows.
As lighting was crucial to the mood of our scene, we used Blender to explore the intensity, color and positioning of lights, but eventually added and finetuned them manually in our code.
To achieve a nice photographic effect, the scene was rendered using a Depth of Field Perspective Camera.
We implemented two extensions to the usual light sources (rt/lights/ambientarealight.h and rt/lights/ambientpointlight.h) whose intensity is not decreasing with distance and used them to illuminate our scene. For the basic illumination we used a blueish ambient area light which is located behind the camera. A little further to the left we placed an orange ambient point light. It creates some interesting shadows (e.g. at the street sign) and mimics the rising sun.
To give the scene a mysterious early morning feel and to create a better depth perception, we implemented an exponential fog model (rt/integrators/foggyrecraytrace.h). This leads to a slightly brighter appearance of objects that are further away.
The only post-processing step we used is a Bloom effect (rt/bloom.h), which blurs the edges of bright parts in the image. The effect of that can be best observed at the headlamps of the car, but also at the bright lights of the buildings.
We used a BVH structure and parallelized the rendering process using OpenMP (rt/renderer.cpp) in order to achieve reasonable rendering times.
LQ: ~ 25 minutes | HQ: ~6.5 hours