Dystopian Architecture: Real-Time Environment Visualisation Techniques in UE4
My name is Mateo Linares and I live in Winnipeg, Canada. I originally studied architecture, receiving a Bachelor of Environmental Design before working as an architectural designer at a local firm.
A year later I decided to pursue my passion for film and video games, and enrolled in an intensive, eight-month 3D graphics program at a local college. Before entering the program, the only 3D experience I had was with NURBS based modeling programs like Rhino, which I would often use for blocking out scenes before doing the bulk of the lighting and surfacing in Photoshop.
Within a few short weeks, I was introduced to the typical asset production workflows for both games and films, learning how to bake down high poly meshes using Maya and ZBrush, creating PBR materials using V-Ray and Substance Painter, and setting up lighting and atmospheres to create dramatic scenes in Unreal Engine.
I immediately fell in love with the speed and immediate feedback of game engines and decided to focus on real-time environment creation for the rest of the course, culminating in my year-end portfolio project which was done over the final 8 weeks.
The Original Idea
The original idea was inspired by the work of the architect Mas Yendo, who designed a series of theoretical projects that were never intended to be built, exploring themes like environmental decay, consumerism, and social isolation. I was first introduced to his work by an architecture professor who noticed my fascination with dystopian, science fiction elements in my work, and lent me a book containing about 10 years of Mas Yendo's drawings, writings, and physical models titled Ironic Diversion.
I was interested in his "Urban Living Unit" projects, which are portable houses that are completely self-sustaining through solar panels and water collection systems, designed to isolate the inhabitants from a harsh environment. Since these buildings were never going to be built in real life, I thought the next best thing would be to imagine them in a game engine. As I fleshed out the concept further, I started to ask questions about the imaginary inhabitant of the house and the world they lived in, leading me to bring in references from other forms of media like Blade Runner 2049, which depicts a very similar situation in its opening scene.
Developing the Scene: First Steps
After doing an initial blockout in Unreal Engine, I photobashed a couple rough concept pieces to nail the tone and atmosphere I wanted to aim for. This is one of the most important stages in the process and I often see people overlook it because they are too eager to begin modeling.
I've come to realize that spending more time developing a strong initial concept can save you a ton of time in the later stages once lighting and composition become important.
It only takes a few minutes to paint over some shadows or adjust color tones in Photoshop, while it can take hours to achieve the same look in Unreal by fiddling around with lighting and post process settings, especially if you keep changing your mind.
A productive way of thinking that I learned in architecture school is to "vomit" your ideas out onto a page (or screen) rather than waiting for an idea to be perfect in your head before doing anything. Having a half-baked idea sketched out in front of you can be invaluable, because it allows you to start asking concrete questions about what aspects work and what areas need improvement, allowing you to make further iterations and get peer feedback.
Setting up the Interior
After developing the concept art, I broke my scene down into modular sections and began modeling the entire scene in Maya starting with the architectural assets like floors, ceiling panels, and walls. To make sure that the interior and exterior assets fit together on a grid, I blocked out the assets as simple cubes first before adding too much detail. Since this was a personal portfolio project, I didn’t worry too much about performance and ended up creating mostly mid-poly assets rather than the typical high to low poly baking workflow.
I kept the total number of wall panel types low to save on time and created slots in these wall panels at a couple standard sizes. This allowed me to create variation between panels by inserting different modules like pipes, cable sockets, and screens.
The computers were the hero asset I spent the most time on. The design of the computers themselves were heavily inspired by the work of Nikola Dimitrijevic, a CG artist whose work I came across while looking for references, as well as other retro sci-fi computers from movies like Alien. I wanted to go for an exaggerated, slightly stylized design by adding multiple monitors along with a mounting system based on old medical equipment.
Because I wasn't too worried about performance with this scene, I was able to do unique materials for most of my assets. To save time and maintain a consistent look across all my assets, I created a few base smart materials in Substance Painter. Using Painter allowed me to create procedural masks using unique curvature and ambient occlusion maps of each asset. I was then able to use these masks with a rust material that I applied at the top of the layer stacks to create a sense of wear and usage across all the architectural assets.
The most complex shader setups in Unreal were probably for the computer screens and nixie tube clock. The screens were all based on a single master material, which I instanced to each monitor with parameters to adjust emissive intensity and scrolling speed. For texturing, any areas of the screen that were to remain static were done in Substance Painter which involved creating some custom alphas in Photoshop.
I stumbled across an excellent CRT monitor filter developed by Cem Tezcan, which comes with many parameters that can be adjusted in Substance Painter to achieve the right look. For the scrolling text, I multiplied a panning computer text image with a waveform pattern that was scrolling at a different speed. To isolate these scrolling areas while maintaining the static areas, I created custom masks in Painter and multiplied these masks with the panning text.
The nixie tube clock was an interesting challenge. Since I only needed to get about 15 seconds of clock footage for the cinematic, I came up with a fairly simple workaround to get the seconds digits animated. Each digit of the clock has a separate material slot. These digits have the UV shells for the numbers 0 - 9 spaced out evenly across the UV sheet. The emissive channel texture is a strip that lights up a single number at a time, which pans horizontally lighting up each number in sequence.
I set the panning speed as a parameter which I could then adjust manually in each material instance. I found that a setting a speed of .1 for the seconds digit and a speed of .01 for the ten seconds digit did the trick. The problem with this method is it stops working after 60 seconds since the timer will continue up to 99 seconds, although it wasn't an issue for this scene.
With this scene, I wanted to show the dwelling of a lonely scavenger in a bleak, polluted environment. I chose to go with a blueish green colour palette to emphasize the artificial lighting and the lack of organic life. I imagined the inhabitant would isolate himself indoors and tried to create a contrast between the bright, overcast exterior, and the harsh lights and shadows of the interior.
A term from fine arts I love to reference is chiaroscuro, a lighting technique that uses these extreme contrasts to create a dramatic, focused composition.
There is a temptation to light everything evenly and avoid putting any of your precious work in shadow, but it is important to understand where the focus of the scene needs to be and become comfortable pushing the rest into the background.
In my experience, lighting in real-time engines often requires a lot of faking to achieve a specific cinematic or stylized look. I like to set up cameras for my cinematics early on so I can get a sense of where the best shots will be and build the lighting setup around them. To achieve this in Unreal, the majority of the lights were set to static.
Baked lighting allowed me to get some nice light bounces and increased the performance of my scene, allowing me to go higher on my polycounts. I had my Indirect Lighting Intensity set to 4.0 as well as setting my number of light bounces to 10 in the World Settings. Many of these settings I discovered through this amazing presentation by a lead artist from Epic Games.
After I had some assets in the scene, I placed individual point lights or rectangular lights lights beside the computer screens and ceiling lights, so I could get a sense of the base level lighting in my scene. I found that this initial setup felt very flat and boring as everything was too bright and lacked focus.
To bring the viewer's focus to the computers, I turned off all the ceiling lights on the back half of the interior and added a green spotlight on the desk that contrasted with the bluish white lights surrounding it. I also increased the lightmap resolutions on the desk and the back walls of the area so that I could get some sharper shadows.
Setting up an atmosphere can quickly become complicated, because Unreal provides you with several different ways to achieve the same effects – either through World Settings, the Post Process Volume, Camera Settings, fog colour and density, or tweaking individual lights. When I begin a scene, I usually reset the scene to a neutral lighting setup by deleting existing light sources, except for a single directional light and skylight. I also set up a lightmass importance volume around my scene, and ensure that camera auto-exposure is disabled through the post-process volume.
At this point I should stress again the importance of having strong concept art or references. For this hazy scene, it was important to start using volumetric fog and atmospheric fog early in the process so I could start dialing in the colours and density settings to match my concept. I found this very helpful GDC talk by Epic Games that explained the basics of Exponential Height Fog. The different options can seem overwhelming at first, but I figured out most of my settings by dragging each slider to the max to see what it did, and then dialing it back to something that looked good.
Finally, once my scene is at a place I'm happy with, I start adjusting the settings of individual cameras that will be used in my cinematics or screenshots. The main thing I took away from this process was that it is important to move slowly with setting up the atmosphere and lighting. You should be mindful of every new element you add to the scene and have a clear understanding of how it affects the environment. It is very useful to have at least one camera set up from the beginning that you can take screenshots from as you progress, allowing you to compare your scene to previous versions.
I hope that readers were able to find something useful from this! I had a lot of fun making this scene and I definitely plan to dive deeper into the many features of UE4 moving forward.