An Environment Artist Son Nguyen shared an extensive breakdown of the Last Stop project, explained how to combine different texturing methods, and revealed some worthy design principles of assembling a scene.
In case you missed it
You may find these articles interesting
My name is Son Nguyen and I’m a Junior Environment Artist currently working in England. I started my career as a Background Artist working for a local animation studio in Vietnam. Two years ago, I took a life-changing opportunity to study Game Art & Design in England and found out my passion for creating games environments. Since then, I have been developing my skill sets towards environment artist roles and never looked back.
It has been a while since my last interview on The Guardians of Light project was published on 80 Level. During the subsequent months, I got chances to attend several interviews with some England-based game studios.
On the one hand, I got exposure to the industry for the first time and also, obtained insights into different disclosed projects. Given that the requirements vary pretty much between the studios, it provides valuable experiences for me and helps me realize the requisite skill set an Environment Artist should have.
On the other hand, the process was lengthy, patience-required, and rather stressful. It’s until recently did I land a junior role at Ballistic Moon studio and got the opportunity to lay my hand on the development processes of next-gen AAA projects, about which I’m excited and content. I’m convinced that the Last Stop project contributes significantly to this fruitful outcome.
About the Project
The Last Stop project starts with a desire to investigate solutions and procedures to tackle an overgrown industrial scene. Developing an individual project from start to finish, normally, requires being proficient and experienced in many different aspects related to environment art. However, there are only a couple of things I aimed to delve into, which are hard-surface modeling and texturing. That is the reason why I chose a heavily-industrial location like this abandoned railway station in the first place. Besides, I utilized Megascans wherever possible to reduce workload, and almost no procedural materials were created specifically for this project.
The railway station is settled in a hypothetical scenario of post-apocalypse and has gradually been reclaimed by nature. However, it's not left completely abandoned but rather a stop-over location for transporting goods and supplements among other settlements. The architecture of the station was immensely inspired by Bristol Temple Meads Station, which is the oldest and largest station in Bristol, England.
Research & Pre-Production
First of all, I need to emphasize the importance of gathering references as one of the foundation parts of our work. I won’t be able to start a project without references and art directions. There were two different reference boards for this project, which I called “macro” and “micro” boards. I used the “macro” board to focus on art direction for the project including the concept, feeling, and mood.
The other one was for micro details like reference images of different objects that might appear on the scene, or material close-up shots. In the former one, the reference images can be categorized into four different groups like this:
- Key reference: this should be the main idea for the scene. It can contain some frames from film and movies, pieces of concept art, or screenshot images from games that catch your imagination. If it’s possible, you can even drop several still-life images of the related location in there as it gives you ideas of how to reconstruct the scene in a logical, natural sense as if it’s in real life.
- Concept art: even if in some cases you don’t want to follow an exact piece of concept art, you still can find some pieces that have specific design elements that you can investigate and apply to your scene.
- Lighting reference: it should contain references about the lighting setting and atmosphere you’re aiming to achieve as well as other subtle individual elements related to lighting. They can be different types of fogs, lens flares, color grading, post-processing, etc. Similarly, these can come from all available sources – from movies and photography to games and illustrations.
- AAA benchmark: these should be considered as the target reference for the project. Gathering a host of environment art pieces from current AAA games certainly helps you aim and push yourself towards the industry-standard quality.
I included some photos that I took with my own phone on the reference board. While the project was under development, I found myself paying meticulous attention to the real-life details which potentially could make their presence in the project. Such details could be something like an intriguing arrangement of graffiti, or the chaotic interactions between karts, old goods, and debris on the street market. Needless to say, being able to observe these details closely and feel the vibes around the location was an advantage in delivering sensible and true-to-life characteristics to a virtually constructed scene.
It’s pretty much straightforward for the “micro” board. I gathered different angles of the props, or sometimes just a single reference image depending on how confident I was with constructing that particular prop in 3D. My point is: the more the better. This board also includes some reference images for some textures and decals that I might use as well.
In terms of tracking your progression, I recommend Trello – a very effective management tool that I use for almost all of my personal projects. By laying out the list of need-to-create assets to different categories, you can estimate the amount of workload you have to cope with during the project. You can even give some simple descriptions or checklists for each of these assets.
Having a Trello’s board helps me greatly in planning out which assets need modeling, which ones should be textured by Trim Sheets or uniquely, or how many tileable materials are needed.
Blocking Out the Scene
Blocking out the environment or grey-box level design to set up the environment with the basic-shaped, and normally untextured objects is a foundation part of the development process. This phase, I believe, is considered the most critical part of any 3D environment. You should make everything fall into place before embarking on asset production. It’s rather difficult and time-consuming to go back to modify or change the layout once you have progressed further in the project.
For this project, building the modular kit for the railway station architecture was apparently the hardest part. It was a tough challenge for me to analyze and separate the entire architectural structure into modular pieces, not to mention my later attempt to take London Paddington Station as a reference. It’s typical of vintage Victorian architecture, which is for sure appealing and yet intricate. Eventually, I remained steadfast in the original idea of referencing the Bristol Temple Meads station as it is simple but concrete and able to deliver an industrial vibe much greater.
I modeled my placeholders inside 3ds Max in its most basic and rough forms. In Unreal Engine, I tested my modular pieces to check if they were aligned and snapped correctly with each other and made some changes if needed. This also was my first-hand experience with Unreal Engine 5, and the first impression began with that you don’t have to worry about baking and lightmaps – it still provides such clean results.
Then, I set up a few static cameras to capture different parts of the environment. Although later, it required some adjustments to the environment layout in order to establish the shots in a compositional way. After the foundation had been laid out, I knew that I was going in the right direction and could focus on asset creation from there.
Asset Production Workflow
Right before the start of the project, I already decided that I would advance to Unreal Engine 5 because of how promising their latest techs and features in this version look. This can partly affect the workflow of asset creation as with the Nanite feature, theoretically, I could go for unlimited triangle counts for the geometry. Nevertheless, I still opted for more common approaches in producing my assets, which are more practical and applicable for different procedures. I used the mid poly approach and high-to-low poly workflow and I’ll elaborate on each of these approaches below.
Mid Poly Approach
The mid-poly approach centers around Face Weighted Normals (FWN), which is a technique that improves the shading of the model. To be more specific, it initially adds bevels then alters the Vertex Normals to smoothen the shading of these bevel faces, rather than across the entire model. It’s extremely impactful as it helps render highlights on the edges caught from light sources, which greatly improves the readability of the model.
Sounds complicated but actually, it doesn’t require much extra time to achieve this. There already is a handy 3ds Max plugin by Ben Boscher that does the trick with just a few clicks. Take this ticket machine, for instance – its rough edges get smoothened after applying bevels and FWN, which results in a much more realistic appearance.
It pretty much depends on the characteristics of the props to plan out how I should unwrap their UVs. If the asset requires some features (decals, numbers, etc.) to be placed correctly in certain spots in the UV space, I go for the unique unwrapping method. That means the UV islands would be laid out perfectly with no overlapping across them. This is the most common approach to texturing but it does take time to unwrap and texture assets individually.
On the other hand, if the asset only contains different materials without features or details needed to place uniquely, using Trim Sheets will be a much better option. One of the best series demonstrating the usage of Trim Sheets I come across is YouTube’s tutorials by Tim Simpson. In short, Trim Sheets reduce a huge amount of time and save memory for texturing as they can be reused across different assets while at the same time providing such an efficient way to texture.
In some certain cases, however, it complicates the approach to texturing assets, which requires the combination of both aforementioned methods. I will explain this hybrid method in the latter part of this article.
High-to-Low Poly Approach
Unlike my previous project – The Guardians of Light – this project prioritizes practicing modeling hard-surface objects rather than sculpting and creating organic assets. From the very beginning, I already had in mind that I would choose one intricate and complex industrial object to recreate. This portable generator, eventually, was the object of choice as it is not only deservedly a challenge for me but also would play a part in the storytelling. It could be considered a small project besides the whole big project.
I highly recommend checking out Hannah Watts’ course on modeling and texturing game props as it provides greater in-depth information as well as video demonstrations of the process. Following the tutorial, firstly, I blocked out the base model with primitive shapes. It would be of great help if you found some blueprints of the object as they usually contain some technical information and three-dimensional structure.
From the base, I gradually matched the model with the references by adding more edge loops, manipulating vertices, and applying the OpenSubDiv modifier to create the high poly version. You should organize everything in proper order and name different sub-objects accordingly because this will make baking and texturing a lot easier.
The process of creating the low poly version, in the next step, was rather simple. I removed the OpenSubDiv modifier from the high poly model, deleted some reluctant edge loops, and cleaned up the geometry. In the end, my final low poly version sat at 26k tris, which should have been optimized even more, but I felt that I was running out of time so, I had to move on. Then, I baked the low poly model in Marmoset Toolbag and finally textured that in Substance 3D Painter.
Hybrid Texturing Method
This method comes in handy on occasions when you are using Trim Sheets or tileable materials for your props but you still want to further add specific details like dirt, grime, or moss as you would normally do with unique assets.
Take this railway train, specifically, for a demonstration of this method. The arising problem was that if I treated this as a solely unique asset with its own unique textures, it would be almost impossible to maintain the texel density with the other assets because of its huge superficies. On the other options, using either Trim Sheets or tileable materials would solve the texture resolution issue, but lacking specific details would make the model appearance become unrealistic.
The situation drove me to texture the railway train in this hybrid method, which compensated for the cons of using unique textures or Trim Sheets solely. It allows using either Trims or tiables while unique details can be added via the secondary UV channel.
To break down the process, the materials for the train are made up of two 2k-textures Trim Sheets. I started with using available materials in Substance’s library or Megascans as a base and blended it with other materials which were driven by either procedural masks or painting layers. Also, I reserved some areas in the Trim Sheets for details like texts, numbers, and decals, which would be applied to the “floaters” later. (Using “floaters”, in short, is a quick way to add some alpha textures to the surfaces without touching their geometry).
Then, I moved on to unwrapping and mapping the UV islands in the main channel with these Trim Sheets. After these UV islands had fallen into place and the Trim Sheets had already appeared correctly on the model, I duplicated the first channel to form the secondary channel.
In this channel, I simply selected all of the islands and packed them to fit into the 0-1 UV space uniquely. Once the model has had two separate channels – the main channel for the Trim Sheets and the second one for unique details – the preparation was done and I exported the model as an fbx file. On a side note, this format supports multiple UV channels while the obj does not.
Switching to Substance 3D Painter, I imported the model and started the process of creating the UV mask. The purpose of this mask was to indicate areas in which unique details such as dirt, grime, or moss would be blended on top of the original materials in the game engine. With an RGB mask texture, basically, you can create up to three corresponding masks within the same texture.
In order to do so, I, firstly, had to add three new channels in SP which corresponded with mask R, mask G, and mask B. Then, I isolated each of these channels and built them up individually. This was the time to get creative as these masks either can be built up from painting layers, generators, procedural masks, or a combination of all.
This also depends on different purposes, but for this railway train, the R channel masked out areas for localized dirt, the G channel masked out areas for rusty bits, and the B channel was for baked AO. In the final step, I packed the masks into an RGB texture and brought everything to the game engine.
It comes down to the scene requirements but commonly, we might need to set up a couple of shaders for different types of surfaces and objects: standard object, surface blending object, landscape, foliage, and specifically for this scene – the UV Mask shader. I won’t go over the details on the others except for the latter, which is crucial to recognize the packed RGB texture we have created before.
The shader can be either built from scratch or in case if you don’t want to go over the tedious process as I do, can be simply borrowed from the handy surface blending material from Megascans as a base and built it up from there. You only have to install the Megascans plugin and go through the MSPresets/M_MS_SurfaceBlend_Material directory to find the shader. Either way, the goal is the same: we need to import the packed RGB texture, switch its UV coordinate to 1 (indicating we’re using the secondary channel) and drive each of these RGB channels as individual masks for blending base, middle and top layers respectively.
I used the MF_VertexBlend material function from Megascans for blending but if you want to build your own, using the Lerp node will do just fine. The result would somewhat look like in the picture below, the base layer would be blended with the middle layer via the G channel from the mask texture before blending with the top layer via the R channel. The baked AO stored in the B channel, furthermore, can be blended with the base color via a Lerp node.
Last but not least, having the ability to procedurally create some puddles on top of the train’s surface was the icing on the cake. If you follow the progress of making the puddle shader by Ben Cloward, you will be able to create this function too. It gives the scene a little bit more sense of natural impacts as theoretically, raindrops might just pass through the apertures in the train shed falling onto the ground tiles or train’s surfaces and eventually forming some puddles.
Assembling the Environment
This has always been my favorite part of the whole project. Especially after spending countless time on modeling and texturing, this felt so relieving to bring the assets in and see the scene start to become true-to-life. I mean, this was a back-and-forth process anyway when I still sometimes went back to model a couple more props or adjust the PBR values of some assets that look odd in the game engine. But it’s always fun to play with the design fundamentals a little bit while unconsciously throwing objects into the scene.
There are a couple of design principles that I think might be worth bearing in mind when it comes to assembling a scene:
- Big, Medium, and Small. The idea behind the big, medium, and small is just to help compose shapes in an aesthetically appealing way. To give you a brief example, you have to avoid placing three boxes with the same or similar sizes at the same place. A better arrangement might be something like one larger box placed next to one regular box and a smaller one.
- Proportions and 70/30 Ratio Rule. This is something I applied to almost everything I have done related to design. The idea is that 70 percent of the surface or area you’re working on should be the place that allows the eyes to rest with a little distribution of detail. In contrast, the remaining 30 percent should be the high-density area with a lot more activities and details that draw a visually interesting point to look at. Expanding this rule a little bit, it doesn't only apply to the distribution of details but is also usable for other methods of contrast as well, so give it a go:
- Light vs dark;
- Warm vs cool;
- Shape contrast;
- Colour contrast;
- Hard vs soft;
- Reflectance contrast.
- Rhythm and Repetition. Repeated use of certain elements like shapes, colors, or silhouettes can help unify everything as a whole. As these elements are repeated, or arranged, the intervals between them can create rhythm or flow that can lead the viewer in a certain direction through your design.
It’s astonishing how lighting can contribute and quickly change the mood of the environment. Honestly, I had been uncertain about the direction of the lighting that I wanted to go for so I tested out several lighting scenarios to see which option suits the most for the theme. Even though the feeling of being abandoned, desperate is something that should be accentuated but I didn’t want to make it completely hopeless and no-way-out. No matter what, the sense of hope should be still there, and in this case, it seemed like the lighting setting of a foggy sunny day matches my description perfectly. The overall mood that I wanted to express is something like “yeah I know it is tough, but life goes on”.
Tech-wise, there is absolutely no reason to ignore Unreal Engine 5’s prominent feature – the Lumen system. Without baking or lightmaps, it can still provide beautiful real-time bounce lighting in a quite simple setup. In fact, having a bright Directional Light seems to take advantage of Lumen’s power the most. You don’t get much real-time global illumination in overcast or foggy lighting setups, normally.
Nevertheless, I had faced one of these challenges during the development: the scene became quite dark even with the Lumen’s bounce lighting. The thing is, there weren’t a lot of light rays that could pass through the train shed with my directional light angle. I didn’t want to change the angle of the light source either, because it could have some impact on the compositions of certain camera shots. It’s always of great help to adjust the environment and in this case, was to open up more holes in the ceiling so that more lights can enter the scene. Besides, I did double up the indirect lighting intensity of the main light source to 2 so overall the scene looks brighter.
For the skylight, I set its Source Type to derive from a specified HDR CubeMap instead of capturing the environment around it. The reason behind this decision was because the whole train station environment is just a small level with literally nothing around it, thus there aren’t a lot of things that the skylight could capture. An HDR map, in some cases like this, would serve a much better purpose with a lot more enriched information and detail. If you don’t know where to find a good quality HDR map, you should take a look at SkyHaven.com and give it a go. You might have to take several iterations to find the most suitable HDR map and its angle for the scene.
As when the light angle is already fixed, one of these tricks that I normally use to manipulate the values of camera shots is to place some fake lights and fog sheets around the scene. It can help ground the focal points a little bit more, while you can also use them to enhance the depth of the scene. Tim Simpson already put a comprehensive tutorial video about this, I highly recommend checking it out. Nevertheless, it’s still considered “fake” effects so you should use them moderately.
There are a few noteworthy things I have done with the post-process settings. I gave it a moderate amount of Chromatic Aberration, Bloom, and Vignette just to embed the scene with a more cinematic look. Also, I applied the sharpening material to PPV, which results in making the render shots crispier. Last but not least, I introduced the “atmospheric perspective” effect into the scene.
This phenomenon, mentioned in James Gurney Color and Light, is described as follows: “The appearance of objects changes in predictable ways as viewing distance increases. The colors of the foreground gradually transform until they match the sky.” For example, on a clear sunny day, the colors of ordinary objects in the far distance such as trees, buildings appeared to be bluer in comparison with those at a near distance.
As Jonjo Hemmens mentioned in his interview with Substance Adobe, there already is an existed handy post-process material that stimulates this atmospheric effect on the Quixel’s Medival Environment project. With this material, you can control the colors of the foreground and background respectively through Z-Depth variables. Notice how the background of my scene became bluer after applying the atmospheric perspective while the foreground feels a little bit warmer.
In terms of the color grading process, you could refer to my previous article on 80 Level in which I described using Lookup Tables (LUTs) and Davinci Resolve for this aspect in more detail.
This was the first time I attempted to tackle an industrial scene like this, so it had been quite an exciting journey with a lot of different new stuff I got a chance to learn, but there were also numerous problems and issues I was confronted with. One of the significant milestones in the project I felt the most challenging was blocking out the scene.
Indeed, besides setting up my modular pieces to make them snap and connect with each other, planning out creating a moderate amount of props that should also be reusable across scenes and limiting the number of unique assets presented another challenge. I didn’t want to make the project become overburdened or undoable for me, but didn’t want to induce the scene to feel lacking in something either.
Once the blockout has been nailed down, the later parts were more like refining processes with a lot of back-and-forth iterations, whereas the more time invested in, the better it should look. Also, there are a couple of things here and there I feel that I should have dealt with better solutions but anyway, being able to pull the project off is already considered a success, I believe. Actually, I already came up with several ideas that might be doable afterward, but I will save and try them out for the next one though.