This tutorial was written by the amazing Neil McKnight and appeared in issue 112 of 3D Artist. Subscribe today and never miss an issue!
3ds Max, Unreal Engine 4
Environments are a multifaceted process, and here we shall discuss the workflow used to create a Mass Effect-inspired environment in 3ds Max and UE4. We will go over current-generation techniques that give the artist more freedom to iterate, and methods that can help to speed up the level-creation process by removing the need for traditional baked meshes.
We shall start by looking at the modelling phase inside of 3ds Max and will also delve into the processes used to construct an efficient modular environment that will be ready for use in Unreal Engine.
Next we shall demonstrate how details that would normally be captured using uniquely baked meshes can be added in engine using a combination of vertex painting and decals.
Step 01 – White box block
The initial white box stage is where the composition of the scene is defined. Try to keep things simple here so it’s manageable and so you won’t be afraid to make quick changes on the fly. Focus on the large forms in the environment first, structural elements and so on before moving onto the medium and smaller details. Bringing a to-scale model into the scene for reference will help ensure that elements like door heights and railings adhere to the correct dimensions.
Step 02 – Placeholder lighting
Adding temporary lighting in 3ds Max while you work will help you to visualise what the final scene will look like early on. Using the realistic viewport mode in 3ds Max with ambient occlusion turned on will give a good approximation of the final lighting you can achieve in engine. This will help you with the placement of light fittings or sun direction.
Step 03 – Utilise the modifier stack
Make use of the powerful modifier stack inside of 3ds Max. Stacking modifiers on top of one another lets you edit a complex mesh before chamfers and other edits are applied. These modifiers can also then be instanced in the scene, allowing all the meshes to share the same chamfer modifier for example.
Step 04 – Modularity vs unique assets
Time is normally the limiting factor that controls the final quality of a scene. By breaking the scene down into smaller modular components and then reconstructing the scene in engine, time can be saved replicating the same modelling tasks, helping the overall performance of the level by instancing meshes in Unreal.
Step 05 – Snap grids
Modelling and snapping to sensible grid units will enable you to make full use of the snapping ability built into Unreal when reconstructing the scene. Try aiming for whole units such as 1 or 0.5m for large structural elements. Smaller meshes such as dressing or props can be placed by eye without snapping, but when placing walls, floors or ceilings it’s important these meshes are precise to avoid any seams in the environment. Pay close attention to the pivot point of your modular pieces before exporting to Unreal. Typically placing the pivot at the base for a wall mesh, for example, will enable you to align this to a floor more easily.
Step 06 – Custom normal approach
The process of high-poly modelling and baking can be very time-consuming and does not scale particularly well with larger assets receiving less and less texel space. Typically, game assets use normal maps to smooth the hard edges of a mesh, but by chamfering edges and editing the normal direction of the mesh inside of 3ds Max, we can get close to the same result without a unique texture per asset. This is also beneficial for memory and performance by cutting down on the amount of textures needed in the scene.
Step 07 – Detail sheet
To reintroduce details lost from removing the baked textures, we will use floating decal cards. Lay out your high-poly details and panel lines flat and bake them to a plane. Make sure to place them at sensible divisions on your texture sheet, as this will enable you to match precisely with numerical values in the UV editor and avoid seams.
Step 08 – Deferred decal shader
As we want the decal to inherit the properties of the surface underneath it (painted metal or rubber), we can create a deferred decal shader that uses the normal and opacity to control its intensity, and lastly the roughness to sell the illusion of a hole or gap by removing any reflections.
Step 09 – Unwrap
TexTools is a free plugin for 3ds Max that speeds up the unwrapping process. It has some nifty tools that come in handy to lay out clean UVs quickly. With tiling textures the layout of these are less important, but setting a correct and consistent texel ratio across meshes is vital to keeping the details in the scene uniform. Make sure to shortcut the common tools such as stitch, break and relax to hotkeys.
Step 10 – Hero decals
We can further complement the previously added details by adding a second texture sheet for warning signs and logos. These can be a great for breaking up a flat surface and adding some storytelling to the scene. Add some dirt and alpha breakup to these textures so they feel slightly worn to help them blend into the scene.
Step 11 – Vertex paint
As the trim sheets and unique unwraps have been replaced with tileable materials, we can use a simple vertex paint shader to reintroduce subtle wear in specific areas of the scene by hand. Having this control allows the placement of wear and dirt buildup to be in more realistic places and not just a general blanket pass over the whole scene. Since you are heavily re-using textures and don’t have many unique materials, putting geo cuts in the mesh to support this method isn’t a big issue. Just be careful to only place these where it’s needed and not by adding even loops over a whole scene. This step should be saved until the last moment when the scene is nearing completion.
Step 12 – Material instances
Creating one or two Master Materials and then instancing them in your scene is an inexpensive and fast way to create material variations. By selectively exposing certain parameters you can quickly make changes to a material without wasting any time waiting for the engine to recompile.
Step 13 – Light the scene
Lighting plays a huge part in the final look and feel of a scene and can make or break an environment. Try not to light the scene too evenly with the same colour or intensity. Instead try to guide the player with pockets of contrasting light. Imagine there is a gameplay objective, how readable is your environment?
Step 14 – Use Lightmass
Enclose your scene with a Lightmass Importance Volume to ensure your lighting bakes are efficiently targeting the assets within your scene. While in the early stages it’s best to keep the Lighting Quality settings set to Preview quality to allow for quicker iteration times.
Step 15 – Post-process
LUT or Look Up Tables are the most efficient way to apply post-processing to your scenes. The easiest way to create your own is by taking a screen grab of your scene and loading it into Photoshop along with the base LUT. Apply layer adjustments such as levels and curves to get the desired look and then re-import the new LUT back into Unreal and place into the colour grading section of the Post Process Volume.
Step 16 – Camera settings and FOV
Placing multiple camera actors in the scene is a convenient way to save key shots you plan to revisit later. Clicking on a camera and pressing Ctrl+Shift+P pilots the camera, enabling easy navigation and makes adjustments to the cameras setting more visible in the viewport. FOV settings in games can vary depending on the game type but for portfolio shots you may want a higher value for a more realistic look.
Step 17 – Level of detail
The beauty of creating assets in this way means that when it’s time to create a LOD, you’re able to remove the small decals with ease. Leave the larger hero decals until two or three levels down to avoid any popping. Save a copy of the mesh before you collapse the stack to save you the manual work of removing the chamfered custom normal edges by hand. The general rule to follow is to aim for half reduction of polycount for each LOD, along with a reduction of material IDs.