Jay Cummings wrote a detailed article about the production of his recent project Slaughterhouse made in UE4. Part 1 covers the pre-production phase, software used, blockout, asset modeling, materials, and foliage. In Part 2, Jay will discuss his approach to photogrammetry, lighting, post-processing, effects and additional materials included in the appendix.
In case you missed it
More posts about Unreal Engine 4
Introduction
This project centers around the creation of a current-generation environment within Unreal Engine 4, inspired primarily by a concept art piece from Arnaud Valette, with the setting and tone drawn from Crytek’s ‘Hunt: Showdown’. The environment itself is a large, dilapidated slaughterhouse structure situated within a Louisiana bayou, set in the late 1800s.
This acts as a full showcase of my abilities as an artist, incorporating organic and hard-surface modeling, technical art, optimization, photogrammetry, an understanding of lighting, composition and visual storytelling.
I utilized industry-standard software like 3ds Max, ZBrush, Substance Suite, Marvelous Designer, Photoshop and more during the creation of this environment. Another aim of mine was to ensure that no external resources were used in the creation of this environment, so everything was created by myself.
Research & Pre-Production Review
A primary point of reference for the creation of this environment was a concept art piece of the same name by Arnaud Valette. I wanted to match the concept accurately in 3D, so pre-planning was done in the form of a paintover to ensure a tight composition and plan moving forward.
To convert it into the dark art direction of Hunt: Showdown, I looked more into the game to analyze the key factors that went into determining its style.
This breakdown, as well as actively playing the game and taking multiple screenshots in different weather/lighting conditions, allowed me to get a better understanding of how to approach the lighting in my scene. Additional color palette exploration was also conducted, breaking down the main colors from screenshots of the game in different lighting scenarios.
More academic resources included Shelter from Lloyd Khan, a book that breaks down wooden frameworks for different buildings and layouts, showing hand-drawn diagrams and dimensions, reinforcement points, potential structural weaknesses, etc. Looking into this area allowed me to create an accurate, structurally-sound building that is well-grounded within my environment.
The research was done to ensure all foliage was accurate to the wetlands of Louisiana, based on an informative PDF file – Wetland Plants in Transportation. This is especially useful as it gives information on dimensions, behavior, and areas of growth, allowing me to create and scatter foliage assets accurately based on the areas within the bayou.
To appeal towards the ideal, modern & next-generation specifications, I’ve chosen the software used within the industry today, including:
- 3ds Max & ZBrush – Blockout, high/low modeling, hard-surface, unwrapping organic modeling, decimation, foliage workflows
- Substance Painter – Asset texturing, smart materials
- Substance Designer – Material authoring, procedural foliage texturing
- Unreal Engine 4 – Custom shaders, technical art tools, level creation, set dressing, final renders
- PureRef – Reference gathering and organization
- Marmoset Toolbag 3 – Material rendering
- Marvelous Designer - Creation of fabric elements
This is all software I’ve had at least some experience with in the past, so I feel more comfortable utilizing it for this project. However, this is the first environment scene I’ve created that has a strong emphasis on organic elements, requiring foliage assets, heavy sculpting, etc. As a result, I’ve also conducted research on specific pipelines in order to get up to speed.
I knew immediately I wanted to emphasize optimization, and one way I wanted to do this was by utilizing trim sheets and tiling textures to reduce texture memory usage and draw calls in-engine, allowing for a higher frame rate. References for this included the infamous Modular Building Set Breakdown from Jacob Norris on Polycount Forums as well as Thiago Klafke’s full modular UDK environment breakdown on his website.
One particular foliage workflow was especially helpful, that being Peyton Varney’s on Artstation. He uses a base high poly model made in 3ds Max, details the mesh in ZBrush, grabs the document normals and height from the viewport and then derives the rest of the maps needed in Designer. This method is highly efficient and proved exceedingly useful for creating varied foliage.
Before this project, I’ve had little experience with photogrammetry, so I wanted to try and learn as much as possible in preparation. For creating tiling materials through scan data, I referenced Grzegorz Baran’s Tree Bark tutorial. This introduced me to using Substance Designer to bake and derive color maps, instead of relying on xNormal. This kept everything mostly in one package, as I could then go on to tweak the resulting maps to remove color information with Designers scan data toolset.
For independent assets, Unity offers a PDF that goes into a good amount of detail with the full process, ranging from pre-production, software, and hardware, all the way to removing lighting and finalizing the asset. It covers these points in all major programs as well, making it easy to translate into my own workflow.
This is also the first project in which I used Marvelous Designer, a very powerful real-time cloth simulation software. I ended up not needing anything massively complicated for the scene, so I spent some time following the basic tutorials available on the main website. For retopology, I found Gladiator 3D through a friend, which includes an automated method of fitting retopologized meshes to already simulated fabric, ensuring clean geometry and deformation. This saved me from manually retopologizing in either ZBrush or 3ds Max.
For more pre-production and research, see Appendix.
Creation
Blockout & Scene Setup
For the blockout, I started with a rough to-scale bounding box mesh, importing it into the engine and setting my main camera angle to match with Arnaud Valette’s concept art. From there, I split up the dimensions of the bounding box in Max and adjusted them to fit within a modular specification, allowing me to create a kit. From this, I’m able to keep it detailed enough to the point where I can later refine it into my final building kit.
I set most of my environments up the same way – I designate my lightmass importance volume, adjust lighting parameters in World Settings, apply a Sharpen post-process material to the viewport, import a UE4 Mannequin for scale, increase Reflection Quality to max in my post process volume and add a large reflection capture to my scene as a base.
First Blockout in-engine (Week 1) / Full block-in & initial material experimentation (Week 5)
With initial materials and lighting being implemented early on, I’m able to get a better sense of where the scene is going. Due to the majority of the building being textured on one trim sheet, I’m able to unwrap modular pieces quickly and see the final result within a small timeframe. This allows for fast iteration and look development, so tweaks were made accordingly as I dressed the scene.
The main aim at this early stage is to add in elements that make the largest visual change, so the first materials created were mud, puddles, the wood trim, and the metal trim. This ensures I’m able to create the slaughterhouse itself, as well as the surrounding land first. Getting these elements in early is especially important as you want to see exactly how these materials work in conjunction with your preliminary light setup, so you know what tweaks to make going forward.
Modeling & Modularity
The modular kit started with single planks with damage and form variants. From there, I branched out and started to create wall variants of 3x3 and 2x3, overhead supports, columns, poles, elbow braces and more. Using this modular method, everything can snap into place in-engine and I can build the framework of the structure with ease, whilst still making look-dev changes easily.
To avoid harsh laser lines in the geometry of my kit, all edges were chamfered with face weighted normals applied to provide a cleaner curvature to the smoothing of the mesh. This method is especially favorable with games that have a lower memory budget as normal maps aren’t required to smooth the shading – Cloud Imperium are especially fond of this technique with Star Citizen.
The modular kit is textured in full using trim sheets and tiling textures, so avoiding repetition was a fun challenge. I ended up adding functionality to my Master Trim shader for a vertex painted paint layer based on the heightmap, as well as a scattered grunge albedo overlay for dirt. This is then further blended with a layer of lichen and controllable wetness, both also via vertex colors. Everything is parametrized, allowing me to make multiple variations through instances of the same material, controlling color, roughness, normal intensity, detail normals and more. This gives me greater freedom in the look development process.
For my main generator asset, I took both still images and video reference to get an idea of how it functions when animated and what precautions should be taken during the modeling process. I adapted a mid-poly workflow for this piece as it acts as an additional focal point that is lit by an overhead lamp, meaning I can justify heavy detailing through additional geometry. This also meant that I could again use face weighted normals and achieve a baked appearance without additional texture maps. That said, I wanted a unique bake to push the detail of this hero asset, so I baked it on top of itself and textured it in Substance Painter.
For the assets that were uniquely textured, I start with a base template of an AO multiply, Curvature overlay at 30 – 55% and an overall sharpen adjustment layer. These tweaks are to help the asset pop and bring out the detail in the materials. After this, I begin building up layers of base materials, assigning masks where appropriate.
Once an initial pass has been completed, I start a wear pass with fill layers and select paint layers to break up flat areas, adding in logical damages to build a story for the asset. Ground dirt, splats of paint, dents, oil leaks, cobwebs, and metal welds are an example of this. Anchor layers are also used to inherit stamped normal data and use it to drive different smart masks.
A lot of the layers and subsequent materials from my painter files are typically merged into Smart Materials, allowing me to re-use them across assets and slowly build up a material library.
This project gave me the opportunity to get to grips with Marvelous Designer a bit more, so I followed some basic tutorials and used it for shredded, blood-soaked fabric that is strung up around the exposed areas of the building. I played around with the idea of having it draped around the exterior and around objects, however, this was later removed to avoid too much visual clutter.
After simulating the cloth in Marvelous, I used Gladiator Tools to wrap a properly retopologized flat mesh around my simulated mesh, removing the need to manually retopologize. This was especially useful as the cloth within my scene is fully physics-based, so proper topology is required to ensure correct deformation during the simulation.
Materials
Due to the highly iterative nature of Substance Designer, I chose it to author my trim sheets and other materials to ensure that if any changes were necessary throughout development, I’d be able to go back and alter without losing any progress. My workflow doesn’t differ from most other Designer artists – I block in height forms in segments, starting with primary, secondary then tertiary, then derive most of my other maps from the final height output. I like to work with multiple graphs depending on what the material requires. I’ll often create utility graphs to generate things like pebbles, stones, grass or my own grunge maps for use in my main graph.
As I’m working with PBR (Physically-Based Rendering), I typically export Albedo, Normals, Height and a packed AORM (Ambient Occlusion-Roughness-Metallic) map. This is the advised workflow as it packs all grayscale textures into an RGB format, with additional room in the alpha channel for any extras – as a result, there are less individual maps to load, resulting in fewer draw calls within the shader.
Foliage
As foliage was a new area for me, I stuck closely to Peyton Varney’s method of foliage creation in order to get great results quickly.
The base high poly meshes are created in 3ds Max from a plane, formed into the base shape from reference, Shell modifier, then FFD’d to achieve the primary forms. I then use the Freeform Polydraw tools to curl up edges and achieve more variation per leaf.
With the base shape formed, I take it into ZBrush for detailing. This typically involves secondary forms like finer stems and folding/curvature in the profile of the leaf. I use a mixture of Standard, Dam Standard, Clay Buildup and Move to adjust the silhouette.
From there, I use the GrabDoc functionality alongside the Al_NormalMap Matcap from Pixologic to get my normal and heightmap. With this data, I can derive all of the maps necessary through Substance Designer.
Within Substance Designer, I rely on a combination of blended grunge maps in combination with my heightmap to generate my albedo. I use a Height Selector node with an adjusted falloff to select specific sections of the leaves, allowing me to introduce more color variation and aging. The last step is to apply the finalized textures to a plane in 3ds Max and use the cut tool to create my alpha cards. I used a fairly high poly count for my foliage to reduce alpha overdraw as much as possible, allowing me to have denser foliage with less of a frame rate hit.
The biggest challenge of this environment came from the creation of the trees. With the scene taking place in a bayou within Louisiana, the tree required for my scene is the Bald Cypress, a deciduous conifer that is usually found in swampy climates. Not only is it a challenge in regards to its unique shape and size, but it also comes loaded with Spanish moss-draped across its structure – another layer of complexity to consider.
For the creation of the trees, I looked at the process that Agnieszka Nogalska utilized for her swamp environment, which involved using ZBrush to kitbash pieces together. I felt like this was the correct approach to take over something like SpeedTree as I don’t need a wide variety of unique shapes and forms with this scene, and this method allows me to focus more on my organic sculpting skills.
I found the ZSphere workflow to be perfect for tackling something that relies so heavily on harsh angle transitions. I started off modeling the base of the tree with ZSpheres, using my foliage PureRef board as a reference to the shape, curvature, and scale. Then, I used Adaptive Skin and Dynamesh to achieve a solid mesh to start adding secondary forms to. I use a combination of brushes throughout this process, mainly Standard and Clay Buildup to define larger forms, Dam Standard to refine sharp peaks and deep cuts towards the base and Trim Dynamic to cut away and create areas of interest.
The branches were a much more tedious process – I started with a sphere and created a few fern blades, followed by some stems and branches using ZSpheres.
These were then kitbashed together to create a good variety of ferns to be placed on branches and used independently on my final texture sheet.
As only one tree variant is required for the scene, I manually retopologized it in 3ds Max to ensure a high level of detail is maintained towards the bottom of the tree. This is then kited and reduced towards the top, taking into consideration the angles the player would see it from.
For retopologizing, I use the Freeform tools available within Max to pull out and manipulate geometry that conforms to the surface of my high poly.
With a single tree variant, I can get away with additional detail from a baked normal map, so I bake my low poly with my sculpted high poly within Marmoset Toolbag 3 and apply it in-engine as my detail normal, blending with my bark material.
Bald Cypress Tree Topology / Final Bald Cypress in 3ds Max
Jay Cummings, Environment Artist
Read about Jay's approach to photogrammetry, lighting, post-processing, effects and additional materials included in the appendix in Part 2!