Mykola Usov did a breakdown of his project, Highway Scene, discussed his approach to modeling and adding vegetation using Blender and its Bevel shader, and talked about texturing in the Substance tools.
Introduction
My name is Mykola Usov, and I am a 3D Artist from Ukraine. I've been in the game industry for more than 7 years now. I have an architectural background but at some point, I switched my career to game art.
During my career path, I had an opportunity to work at Frogwares on The Sinking City and Sherlock Holmes game series, at Ulysses Graphics on Farming Simulator and Call of Duty game series, and finally at Starbreeze Studios on Crossfire project.
Highway Scene: Idea and Reference
The project was originally planned as a portfolio piece, but at an early production stage, I decided to make it as an asset pack for selling on Unreal Marketplace. This significantly increased the production time since in this case, I had to use only my own materials, textures, meshes, and other assets.
The scene is based on an existing location in Stockholm. I happened to see that place in the evening and I liked the composition and lighting a lot. I took some photos there. Also, I collected some construction sites and road repairing references. It's really common to find such stuff all over the city.
Production
I'd had experience with 3ds Max and Maya but I chose Blender as the main 3D modeling software for this project. I thought it was a great opportunity to learn new software during the production process. I am happy with my decision as Blender is a great and powerful constantly developing 3D modeling application with a large growing community, responsive support, active forums, etc. Furthermore, Blender functionality is easily extendable with a lot of free and paid add-ons. It’s not hard to believe that Blender will be the industry standard in the foreseeable future.
Blockout
First, I blocked out the whole scene in Blender.
At the initial stage, when I still wasn't sure how big the scene would be, I simply blocked big surfaces like terrains, roads, rocks, etc. Later, after some tests in the engine, I improved detalization for them.
Unlike using this approach for the big surfaces, I built quite detailed blockouts for props. I sought to catch correct proportions straight away and add all the necessary details. Having such detailed blockouts gives me an ability to turn them into the final lowpoly fast and easy.
I usually set the overall scene composition at this point. Then, at the final stages when assembling a UE4 level from the final assets, I can easily rely on the already existing scene blockout.
When making props and environment parts, I used a modular approach where it was reasonable. For instance, all the construction and wooden fences, traffic barriers, bridge elements, railroads, etc. are modular. Seeking for more interesting and original composition, I built the elements of the main world, like whole terrain, highway, cycling, and pedestrian lanes as unique, non-modular pieces.
Blender Bevel Shader
I used the amazing feature of Blender called Bevel Shader a lot in this project. In most cases, you don't need to build highpoly at all or you need to build it for very few parts of the model using this approach. It saves me a lot of time.
My usual workflow for props is:
- Build lowpoly.
- Bake tangent normal bevel map directly from lowpoly. Use free TexTools add-on for this purpose.
- Add the necessary details to the normal map. Details could be added with Substance Painter or Photoshop but another way is to bake additional details from decals using Blender DECALmachine add-on, then combine baked normal maps together.
- Texture the asset in Substance Painter.
Approach to Texturing
One of the goals for this project was to keep texel density around 1k per m². I used unique textures for small props and tiling textures for medium/big environment assets. The main approach for such objects is using a UE4 layered material which enables you to blend tiling texture sets through unique or tiling masks and Vertex Colors.
I use Substance Painter for texturing purposes. My texturing methods are quite usual. When I use Bevel Shader for normal map baking I don't have proper highpoly to bake ID maps. Substance Painter's Polygon Fill tool helps me to determine ID masks. Using these masks, I split the whole model into materials with Fill layers as a base. In the Fill layers, I used my own texture sets or materials from Substance's default library. When adding some wear and tear to my models, I usually rely on Smart Masks which I improve manually by adding extra details in Paint Mask layers. I also generally add dust/dirt layer through AO based Smart Mask on top of everything.
When I prepare unique masks for environment pieces approached with layered material, I also rely on Smart Masks, compose final masks together from a few layers, then pack everything with Anchor Points for easy export to the engine.
Using layered materials is also good from the optimization perspective, as you can use the same texture set in completely different materials.
Vegetation
Vegetation was manually built in Blender. All the foliage and grass textures are based on my own photos.
When it comes to the outdoor environments, it's reasonable to keep your vegetation polycount as low as possible. For some of my trees and bushes, it's only around two hundred triangles.
To improve foliage shading, I used simple Transfer Normals Blender add-on.
To make vegetation look better at a far distance, I increased Opacity Mask Clip Value in my foliage material.
Furthermore, I did a simple setup inside the material which increased the normal intensity with distance.
Rocks
For rock highpolys, I tessellated already existing simple blockouts and applied the height map generated in Substance Designer.
The height map was done using Pierre Fleau's Substance Designer graph that I slightly modified.
Rocks as well as other environment assets use a UE4 layered material.
Highway and Roads
I used the same layered parent material for all the environment stuff in the project, but material instances are set up in various ways depending on the particular needs. There are two different road material setups in the scene: a cheaper and simpler one for cycling and pedestrian lines and a more complex setup for the highway.
The road material instance includes three layers with tiling texture sets blended through tiling masks and Vertex Colors.
The highway material instance has a more complex setup. Besides three layers, it uses an additional global normal map and a global tint map which both influence all the layers.
Lighting and Post-Processing
The lighting setup is quite simple here. Lighting is baked, but I used Stationary DirectionalLight and Stationary SkyLight with HDRI. HDRI was taken from hdrihaven.com, you can find there a lot of HDRIs licensed as CC0.
There are no other lighting sources besides Directional and Skylight in the scene. In the DirectionalLight settings, I enabled the Area Shadows option, which makes precomputed shadows softer the further they are from shadow casters.
Additionally, I used Dynamic Cascaded Shadow Maps with 5 cascades. With this setup, I got HQ dynamic shadows close to the camera with a smooth transition to the baked static shadows in the distance.
The post-process setup is really simple, too. I increased the intensity of Global Illumination a little bit, played with Auto Exposure, and the Screen Space Ambient Occlusion setting. This is pretty much it, I didn't change any Tonmapper or Color Grading settings.
Challenges
The most challenging part of the production was the technical setup in Unreal. I created quite complex parent materials in the engine and it took a while to implement all the features I needed and make everything work as intended.
Also, as I’ve previously mentioned, this was my first project with Blender as the main 3D package, and I spend some time to move my whole pipeline to Blender. There are some differences in how Blender works compared to Maya or 3ds Max, so I've used a bunch of simple free scripts and add-ons to customize the app and make everything work in a way I got used to.
And finally, it was not so easy to stay focused during the production, as this is the most complex and long term personal project I've ever done.
Afterword
I'd like to say thanks to everyone for reading. I hope the information covered in this breakdown was helpful. If you have some additional questions please feel free to contact me through my Artstation page.