This project was inspired by the subway scene in The Last of Us. The most attractive part of this scene to me is the god ray that shines in from the broken roof, creating a great contrast in light intensity at the visual center. In the dark areas, the bouncing lights generate beautiful subtle grayscale transitions.
I also aim to emulate the workflow of Naughty Dog, with Substance Designer and modular parts as the main focus for this project. It took me two weeks, plus one day, to complete.
- Substance Designer & Painter
- Unreal Engine
Block Out & Modeling
The subway structure is quite simple. I start with the default white cube in Unreal, then split it into modular parts. From my experience, the height of the walls and columns can be any amount you like, while the width of the modular should be an even number: 0.5m, 1m, 2m, 4m, etc.
This way, there will not be a seam on the tileable texture. The pivot of each modular part needs to be at the corner, not the center. This ensures that the modular parts align perfectly in the Unreal Engine.
Substance Designer Texture
In this project, I chose 2048 px/m, meaning one 4096 texture can fill up a 2 square meters wall. Since this is a personal project, I don’t need to consider performance optimization.
Like the modular wall width, the tile texture in Substance Designer should also be an even number. In this project, the ground tile number for each line is 8, which means 4 tiles per meter. This way, each tile fits into our different sizes of modular parts.
For me, one of the most powerful features of Substance Designer is that the graph can be easily reused. In this project, the tactile paving and the ground tile share the same mud graph. The concrete and the ceramic tiles share the same crack generator. I always organize my substance graph in exactly the same structure: start with a basic shape, then blend different effects on it.
There are no branches in the graph; every effect is modular and organized around one central line. This way, each part is totally individual and can be easily reused. I can add or remove any part from the center line without messing up other parts. I don’t like collapsing the graphs into nodes; it is not convenient to adjust when you reuse them. I just frame them and copy the frame from one graph to another.
Substance Designer can also quickly generate different versions of one material. For example, I use a histogram scan node to adjust the ratio of the broken tiles and a blend node to adjust the yellow leak. By adjusting two parameters, I can get four different versions of the ceramic tile. The same approach can be used on cracks, dust, paint, rust, and any effects that you want.
I save a lot of time by doing things like that. The more materials I create beforehand, the more resources I can reuse when I create a new material. So it is a good idea to prepare your own Substance Designer material library.
The vertex color has four channels: RGBA. Each channel can blend two materials in black and white painting, so theoretically, you can blend 8 layers of different materials. But I think four layers are enough. In Unreal Engine, the height lerp node is a better choice than the ordinary Lerp node.
I can input the height map and get a better-quality blending.
In this project, asset creation is not my focus. So I just gathered different kinds of assets from the Unreal Marketplace to enrich the scene. In most cases, it is difficult to find assets that match the style perfectly, so I import them into Substance Painter and make some small modifications.
This way, I can skip modeling, baking, and UV unwrapping and keep the focus on materials.
Lighting in Unreal
This project is fully lit with the Lumen system. I use a giant mesh light on the roof hole. Unlike the directional light, mesh light does not generate sharp shadows, giving the scene a soft bouncing light. I keep the volumetric fog intensity at a low level. I prefer to use fog and god ray plane, which is easier to control. The god ray plane comes from Unreal’s official showcase map: Particle Effects.
For objects with strong reflections like water and glass, I put them into a separate light channel, so I can control the reflection individually.
Typically, the normal light cannot generate sufficient reflections, so these objects need additional fill light.
Thanks a lot to GameArtists for inviting me to write this article, and to anyone who took the time to read it. I hope this may help you.