logo80lv
Articlesclick_arrow
Research
Talentsclick_arrow
Events
Workshops
Aboutclick_arrow
profile_loginLogIn

Using Blender & Substance 3D Designer to Make a Stylized Diorama in Unreal Engine 5

Justin Wallace showed us how he created the Redstone Garden project, explained surface and object tiling in detail, and demonstrated the work on materials and shaders.

3D Artist Justin Wallace has joined us to share his wisdom about creating stylized scenes for games in Unreal Engine 5. 

Wallace lives in California and focuses on stylized environments for games. He graduated with an AA from the Academy of Art University in 2022 and is now pursuing more education at Vertex School to push his skills further. 

"This was my submission for term 2 out of 3! I’m currently working on my portfolio to start a career in the AAA games industry, hopefully one day soon! I’m so grateful that I get to share a piece that I learned a lot from and hopefully give some insight into how to make this. More work is available on my ArtStation. A big thank you to 80 Level for kindly reaching out to me.

There's a little about me as an artist ahead, so just skip the next paragraph if you want to get straight to the learning.

I’ve always been an artsy kid growing up and had a huge passion for games, film, and comics. I was drawing on anything I could growing up and was way too into Sonic, Halo, and Dead Space. I have a lifetime of memories that came from creative endeavors with friends who fostered my passion for art. I made comics and little films and worked on a kids-based MMO as a 13-year-old artist – my first job!

I was a musician in my teens and early college (that’s a different article), then made a complete switch to 3D in 2020 as I sorted out what type of career I wanted to have. 2017’s Resident Evil 7 rocked my world so hard, I started playing games all the time again and began looking into 3D game art. I started transitioning from an indie gamedev mindset to a career path in 3D environment art as my path grew in that direction the most and I fell in love with games like Dark Souls, Destiny, Apex Legends, Overwatch, and Valorant.

I took the leap of trying college again at the Academy of Art where I received a Game Development degree in 2022. I did get to work in games for a while, and it was a great experience! It has been so rewarding to immerse myself in a craft I enjoy to become the best I can be and see what I’m capable of as an artist. 3D Game Art allowed me to completely change my life and I would have never imagined a future where I have a degree in something I love, an artistic skill that provides tangibility to my favorite craft, and a wonderful partner whose interest aligns with something I’m so passionate about. It has been one of the greatest gifts I could imagine. The industry can be tough and competitive, but there’s value in that as well. I have a lot to learn, a lot to prove, and a lot to share, so let’s get into it!

The assets for the Redstone Garden project were mostly done with mid-poly modeling and UV mapping to tileable materials and vertex painting. Wallace prefers tileables to trim sheets unless it’s a more ornamental or decorative surface as it allows for more control over the content of the material when doing shader work.  

"The origin story of this project is a mess. Long story short: I planned to make an environment in 12 weeks, and 8 weeks in, I wanted to restart. Crazy, I know. That means I had 4 weeks to create materials, find a concept, do pre-production, modeling, texturing, rendering, etc. That’s a lot of work, and finding a workflow that allowed me to create something fun in just a few weeks was a huge learning experience. Below is a render of the environment that had taken 8 weeks, where I built a majority of the shaders needed to accomplish the Redstone Garden shortly after. (I’ll polish and iterate on this one sometime soon!)

"This whole endeavor was going to have to be about speed. First, I needed a good concept. After hours of searching, with time ticking away, I found a great concept art by sx! He has a great sense of composition, texture, and lighting. It was the perfect challenge to take on in a 4-week sprint, so I went straight to work! Unfortunately, the poor adorable chicken didn’t make the final cut in the given time."

"As a junior artist, I need a really thorough PureRef board. Like everyone else, I highly recommend this program. I use it for subject reference, style guides, color boards, influences, matcap renders, shader tips, and more. Using PureRef to gather my thoughts, lead me in the right direction, and give me immediate reference to the goal was invaluable. I strongly suggest building a huge board so you can always have a monitor to stare at for direction and inspiration! "

"Unlike my last environment, which was a completely modular colonial house kit, it made more sense to prioritize the unique proportions of Redstone Garden and worry a little less about construction in-engine, so the kit used isn’t particularly modular. If I'd had more time, I could have definitely tweaked the topology and dimensions to get something more reusable for a snappable grid!

Modular or not, I broke down the concept art to define what elements will dictate the collections and organization within Blender, my top choice for 3D production. This was a great exercise to not only examine what elements can be repeated but gave me enough time with the art to decide what textures and shaders I needed to get to the finish line."

"The biggest sacrifice from this sprint was the lack of ZBrush sculpts to show off. As an alternative, I cracked my knuckles in Substance 3D Designer to create a library of materials. I referenced the color-coded concept art and wrote up a whole document that detailed what surface I needed and which one of my custom shaders would accompany a particular mesh (don’t worry, I’ll get into shaders!) I seldom see environments that rely solely on Substance 3D Designer materials, so the real challenge was to see if enough polish on the materials and shaders alone could make up for the lack of unique sculpts. Surprisingly, this actually worked for this scene and reminds me that this workflow could lend to creating environments faster and more often. The two sculpts I had time to do were a couple of small boulders (reused in the background) and a sculpted brick wall."

Now let's move on to blockout. The composition and blockout were pretty straightforward: Wallace already had a strong concept to work off of, and a single building being the focal point made camera work and scene building much easier for the artist.

"I was able to work on each asset separately based on the color-coded reference within Blender and then adjusted proportions until I got a little closer to the original silhouette of the house concept. While the house composition provided little trouble (direct export from Blender to UE5), the landscape sculpting and correct focal point in the final shot needed more elbow grease than anticipated.

Here is a quick example of the iterations the project went through. The concept did not have a background, and with time running out, I used the boulder from the original ZBrush sculpt to create some cliff-like backgrounds covered in a stylized fog shader that I’ll show you how to make later."

"Here are some composition tips:

  1. Set up some fundamental elements within Unreal Engine before beginning. For me, that means setting up the following: Landscape, Basic Shaders, Camera Focal Point/Aspect Ratio, and Basic Lighting Setup. Doing this allows you to have an easier time implementing assets into the final scene as well as setting up consistent colors in the materials as you work on the project. This isn’t a hard rule, don’t be afraid to change what’s not working. 
  2. Light your scene before diving into the modeling phase if you already have a concept. Having an exterior scene meant I needed all the essential components: Directional Light, Sky Light, SkyAtmosphere, ExponentialHeightFog, Volumetric Clouds, and PostProcess. You’ll be surprised how much time you’re going to save when polishing materials with a full lighting setup and camera setup compared to juggling the interaction between lights, camera, and materials throughout every iteration.
  3. I didn’t need a blockout for this particular scene, but they are essential for scene composition without concept art. You wouldn’t want to put hours into making an asset that you find doesn’t fit the final composition. I have yet to try Unreal’s modeling tools, so even for a blockout, I’ll create my basic shapes in Blender and then export them into Unreal Engine. With the correct planning (and some luck), these can be used as the final assets by reimporting the FBX file over iterations. 
  4. Import the Unreal Engine mannequin into Blender to get a relative sense of scale in the modeling process. Scale and Origin Points must be considered for all exported objects when translating your modeling work into Unreal Engine. Without a good scale/origin point, you may get stuck changing the transforms of your assets in an ineffective manner in-engine."

Wallace shared that all the assets were modeled and UV-mapped in Blender. He imported his new Substance 3D Designer material library into Blender so he could UV-map models to tiling materials without creating a unique texture for every object within Substance 3D Painter.

"I’ll be getting the variation at a shader level instead, and I find it to be way more fun to tinker with. I couldn’t get too distracted with props, and I needed to find out how fast I could get the house in-engine. The color-coded reference allowed me to tackle different elements of the concept in a more organized manner. If I sculpted a kit of wood planks and bricks, I would get the added benefit of both a macro normal on each mesh but also RGBA masks for more detailed material variations. My next project will take advantage of these shader tricks!"

"This scene was built with a mid-poly workflow to get some high-quality edges in the models without needing to sculpt them. I used a pretty basic approach to get all of this modeled and UV-mapped. Mapping to tileables meant that I needed to straighten as many UVs as I could so that the direction of the wood grain would map correctly on curved pieces and other objects.

Here’s a glance at the workflow I used to build these pieces.

1. Wood Planks 
I modeled a simple low-poly wood plank with a few loop cuts to change its dimensions slightly. I’ll make a few dozen variations length- and height-wise, then UV-unwrap them all at slightly different positions in the UV editor to give each plank a different part of the texture. I added a Bevel modifier to every wood plank with a small amount based on the angle to give each angle a triple edge. This is done by setting the Segments to 2 and the Limit Method to Angle. Then I turn on Harden Normals and auto-smooth the meshes to get more natural normals."

"2. Curved and Complex Wood Planks
Instead of cubes to build the base shape, I use a Mirror and Subdivision Surface (only 1 division) modifier along with creases to build the desired silhouette of my wood plank, then use the Solidify modifier to define the thickness. I can then use the same Bevel modifier trick. This stack of modifiers is a pretty handy way to get some complex shapes with thickness. You will need to apply the modifiers (except for bevels) if you want to UV-map these correctly."

"3. Archway Bricks
I originally wanted to sculpt these, but I was able to get away with a really quick way to have it pass my personal quality check at a distance. I added a set of about 12 cubes, knife cuts and edits to each for slight deformation, then used the Curve modifier to bend the mesh around a spline before beveling. I then used a mirror modifier if it needed to be symmetrical."

"4. Roof Tiles
I modeled a single roof shingle, duplicated it a few times, and then projection-mapped the meshes to different tiles of my roof tile material! Unfortunately, I didn’t get time to learn a procedural method of placing the roof tiles aside from curved arrays, so I placed about 150 groups by hand. I’m sure there are better ways to do this, but the roof shape was a bit irregular and I brute-forced the end result.

Note: in the GIF of the building iterations, you can see I had a mesh that acts as the underlying surface of the roof tiles. This allowed me to place the tiles appropriately without too much guesswork, as the under-surface material are roof tiles that are the same size as my roof shingle models."

"5. Preparing for Vertex Painting
Because we are getting our texture variation from vertex painting in Unreal Engine rather than creating layers and masks in Substance 3D Painter, we need some extra vertices. I did a pass of going throughout the model and adding evenly distributed loop cuts to areas where I wanted more flexibility in the vertex painting. When you import your model, select the vertex color override and fill the mesh with black so you have a clean 'canvas' for vertex painting."

"6. Small Props
Props are another addition I would have liked to sculpt, but using these tileables for 99% of objects offered a consistency in the presentation that was actually pretty great looking by the end. I would model basic objects like crates and barrels, then use the same Bevel modifier trick to give it a nice softness. I used material IDs like the house to define the materials of the props. For example, the barrel uses a wood plank material I made rather than modeling the individual planks. By adding some extra vertices, vertex painting gave it the necessary variation to make the cut in the final render."

"In a workflow like this, the UV-mapping process and modeling work more like a dance between the two workflows rather than a linear step-by-step process. The end goal is to have these hundreds of wood planks UV-mapped appropriately to their tileables or trim sheets. This is best achieved by straightening the UVs and setting the correct texel density. 

If you are going to sculpt your object first but also want to take advantage of tiling textures, then you need UVMap01 for mesh maps like Normal/RGBAmask, and UVMap02 for tiling textures. You can combine the elements of the two later on in Unreal’s shader editor.

I needed two add-ons to UV map the objects for tileables. The first is UV squares to easily straighten most UVs without Follow Active Quads. The other is the texel density checker to set the desired texel density for each object’s UV map.

"1. After you have a couple of low-poly objects modeled, begin marking seams. Select “U” for “Unwrap” and go to the UV Editor. Go to the UV Squares Add-On and select “To Grid by Shape”

2. Go to the texel density checker and select the size of your image texture at the top. Select your desired texel density, then click on “Set TD” to apply those settings. I use all 2K textures set to 10.24 TD."

"3. While constructing your scene, take advantage of the “Correct Face Attributes” in the tool menu. If you have an object already UV-mapped and duplicate it, you can use Correct Face Attributes to have the UV map transform along with your edits. This is great for changing the dimensions of duplicates. Turn the feature off when rotating your object in edit mode. 

4. After every couple of objects, make sure that your objects still share a consistent texel density by selecting all desired objects and clicking “Set TD” again. This also applies to the “To Grid by Shape” feature, as they may get distorted using Correct Face Attributes. To summarize, use these two add-ons to make sure all objects have straightened UVs and texel density. 

5. Move your UVs around! By moving entire UV islands in the editor, you can get a lot of variation in the duplicates just by moving the UVs a little bit."

Next is the foliage, a prominent part of the whole scene. Wallace hand-painted a Foliage Atlas Opacity mask in Procreate on his iPad.

"miHoYo style foliage seemed to be a great method to save time, as the foliage textures are more abstract and expressionist. The shader does more of the heavy lifting than any hand-painted details. I really enjoy working with Procreate when hand-painting certain assets as it lets me feel a bit more artistic in this very technical project. I plan on working more with hand-painted foliage to push my skills further!"

"1. I imported the Opacity map to Blender as a transparent plane, selected “Correct Face Attributes”, and began cutting up the atlas into separate 2D alpha cards. Cut up your foliage atlas plane into separate 2D cards. Duplicate these cards and transform them to create low poly foliage. This method isn’t very procedural, so focus on what looks good and don’t overthink it."

"2. For foliage with more density like my potted plants, I’ll duplicate the original card and rotate it by 90 degrees to get a fuller silhouette. These are also placed by hand."

"For super-dense foliage like ivy clusters and the spruce tree, I created some vines with the skin modifier in Blender, then used the built-in Hair Particle system to scatter the foliage cards around the vines."

"I find that there are 3 three main methods to shade your foliage. Here’s a little rundown. 

1. Regular Shading: For foliage like ferns, clovers, and branch alphas, set to shade smooth and that’s it. We want it to reflect against light in an accurate way.

2. Normal-Up Shading: For grass cards that interact with runtime virtual textures, I set the normals to face upwards so that they blend with the landscape in a painterly manner. Use Mesh > Normals > Point to Target (Alt + L shortcut) and click anywhere. Use the dropdown menu to set the Z-height very high, forcing all normals to point upwards."

"3. Spherical Shading: For dense foliage meshes like a bush, cluster, or tree branches, we use spherical shading to get smoother normals. Create a subdivided cube and transform it around your foliage mesh. Use the Data Transfer modifier on the foliage and select your cube as the source. Select “Face Corner Data” and “Custom Normals”, then auto-smooth. Now we’ll have softer foliage clusters in-engine!"

"To export my models, I organized my architecture into a series of collections, then selected all the objects in the collection to export as a single FBX. I like to work as non-destructively as I can, so I have a backup of the building with all of the modifiers, and I still am not joining the meshes even in the “export” version with modifiers and transforms applied. You only need to select “Combine Meshes” in Unreal Engine 5’s mesh import window. 

Since this wasn’t a modular project, I had no problem setting the origin of all house objects to the world origin. However, if I needed to import these objects as modular pieces, it’s important that the origin point of each collection is defined and is in the appropriate place to snap to a grid."

"Since this wasn’t a modular project, I had no problem setting the origin of all house objects to the world origin. However, if I needed to import these objects as modular pieces, it’s important that the origin point of each collection is defined and is in the appropriate place to snap to a grid. Here are my export settings."

After this step, it's time for the texturing part. Wallace believes this is where the real magic happens as a good material can make even a basic plane look appealing. He used this sprint as an opportunity to dive head-first into authoring custom materials for stylized scenes. He would like to develop this workflow more and have a fast and flexible pipeline to create great materials. 

"Before we get into the procedural materials and shaders, I’ll give you a tip on tileable sculpts from ZBrush to Substance 3D Designer. We typically need two types of tiling on a ZBrush sculpt: surface tiling and object tiling. First, create a 4096x4096 document, then use the document zoom feature to see the entirety of the document. 

For surface tiling, initialize a Q-Grid, subdivide once (smooth off), and polygroup the middle four quads, and then subdivide a few more times to prepare it for sculpting.

For every brush, select Brush > Curve > WrapMode: 2 for easy tiling on a surface, treating the four-quad polygroup as the canvas (I have a shortcut for this function in my custom UI.) Begin sculpting!"

"As for object tiling, because we’ve set up surface tiling in ZBrush, we are now working in ZBrush units. With this, you can get perfect tiling while scattering any mesh on our tileable plane with the Deformation > Offset feature. If you move an object past the inner polygroup of our tiling plane, duplicate the object with (Ctrl – Shift – D) and select Deformation > Offset: 1 on an appropriate axis to make it tile in the view. 

Objects that extend to the corners of our tiling surface polygroup must have 3 extra duplicates to tile correctly, while objects that extend past one side must only be duplicated to the opposite side. That means that if an object reaches the edge of the left side, use Deformation > Offset to move it to the right side. Same for top and bottom objects."

"Surface tiling is needed to sculpt organic tiling materials like dirt and rocky planes. Object tiling is needed to scatter meshes like roof tiles, brick walls, or skeletons in a tileable way!

Heightmap to material:

  • Use F to focus on the middle polygroup that acts as our tiling canvas
  • Use the alpha brush menu to select GrabDoc and Export to your desired folder to have a texture of the height map
  • Plug the heightmap into Substance 3D Designer (or Painter) and process the same way you would a procedural texture. That means that you need to use a couple of different methods to extract and process masks to get a desired normal, color, and roughness map. You can use the RGBA Merge node to compress the maps into an Unreal Engine 5-compatible texture set."

"Here’s what the processing for the roughness map looks like."

"Substance 3D Painter: An optional way to get more masks for your material is to export a high poly of your tileable sculpt and bake that information onto a flat plane. You can then use smart masks to create masks unique to the sculpt and then either finish in Substance 3D Painter or Designer. Personally, I like to make my materials in Designer, add some Substance 3D Painter masks if it’s from a ZBrush sculpt, and use ZBrush’s GrabDoc height map instead of Painter’s height map."

"While this brick wall didn’t make the cut in the final render, I figured that the process of creating it provided a lot of valuable knowledge that can be practiced upon for future environments! I needed a bit more flexibility in the final results, so all materials ended up being 100% Substance 3D Designer and Procreate."

Materials and shaders played a big role in the project and shaped the final image nicely. Here is how Wallace achieved worked with them: 

"Substance 3D Designer terrified me for the longest time, you can tell by the way I model roof tiles that going full procedural was quite scary. Out of the 4 weeks, I did spend an entire week within Substance 3D Designer just authoring procedural materials based on the document I had written during the pre-production phase. There is a mix of basic and advanced techniques used to create stylized height maps with painterly diffuse color and roughness. I won’t be breaking down my materials piece by piece here, but will lend you some neat techniques used for the procedural brick material that may come in handy for your own work."

"1. Better Bevels & Random Height for Tiles

If you try to give your beveled tiles random height with just a flood fill, you’re going to get inaccurate bevels. Let’s make our own random height generator!

  • Plug your B&W Pattern into a Bevel set to Full Distance, then use Auto Levels to get the full range of black to white. 
  • Plug the B&W Pattern into a flood fill, and get the FF Random Grayscale node. 
  • Get a Distance node. Plug the FF Random Grayscale into the Source Input and plug your B&W Pattern into the Mask input. Now our tiles have no gaps and random height.
  • Blend your Beveled Tiles with the result of the Distance Node (Blend Mode: Multiply) to get fully accurate random height on your tiles."

"2. Vector Warp Grayscale for Surface Damage

When overlaying a surface like grunge onto your tiles, use a Vector Warp grayscale node to place the grunge randomly onto different tiles. In this example, I’m plugging the result of our Distance node into a gradient map to have it read the grayscale values as color and plug that into the Vector Map Input of a Vector Warp node. This warps the grunge appropriately to the mask. Use Blend Mode: Min to carve away at your surface in a more natural way than the Multiply Blend Mode."

"3. Edge Chipping with Tile Sampler and Blend

I used 4 little rock height maps to use as inputs for my tile sampler. By scattering these rocks and then blending it with a Flood Fill to Random Gradient (Blend Mode: Multiply), then clamping it with Levels, we can get a couple of different variations of cuts with a single tile sampler. Instead of blending all of the cuts together, I blend them one by one on the height map for a little more control (Blend mode: Min). You can then use another Random Grayscale Distance or Random Gradient + Distance as an overlay blend for some more pop!"

"4. Grout with Tile Sampler & Height Blend

I used the same rock height maps to plug into a new tile sampler with a much higher pattern amount so that they look like little pebbles. I did some level editing on an Ambient Occlusion node from our current height map and Inverted that to get my Tile Sampler Mask Input. In this instance, the mask makes it so that the grout only spawns in between the bricks. I did some more processing to it afterward, but it was really just a series of experimental non-uniform directional blurs and multi-directional warps to break up the shape. Plugging any pattern into the Normal node and then the Curvature node along with a histogram scan can make for some really cool masks. No hard rules there. After it looks good, I simply use a Height Blend node set to Bottom Height Priority. Changing the Height Offset raises the grout!"

"5. Color and Roughness from Curvature, Grunge, and Gradient Maps

Color is fairly straightforward for stylized surfaces. You’re looking for subtle hue variation, broken-up forms, and just enough detail to read properly with the normal and roughness maps. As you get more familiar with Substance 3D Designer’s nodes, you’ll end up creating the needed masks through intuition. 

  • First, I plug my height map into a gradient map to get my first few base colors. This time around, I worked with greyscale values to get a better read of the brightness before adding in some color variation through gradient maps and uniform colors. I plugged the Height into the Height to Normal World Units for a very strong Normal conversion, which can then be plugged into a Curvature Smooth and Histogram Scan to get some sharp interesting masks out of your original height map. Blend some of these scanned curvatures to get more interesting variations."
  • "After that first pass, I then blend the color with Inverted AO (from Height) as the mask for a subtle shadow color. The type of grunge you used to blend more colors on top doesn’t need to be specific, but you do need to plug your grunges into a Directional Warp or Vector Warp so that these grunges displace naturally on your material. In the example below, I’m using a very simple brushstroke generator I made to get a few tiling brushstroke patterns, used levels to make the brushstrokes more sparse, and then plugged it into a Directional Warp node. The Warp Input is the Height Map that has been Quantized with the Quantize Grayscale. node. This creates an interesting split between the brushstroke patterns."
  • "The roughness map is made with the same approach. Extract some curvature masks, overlay a couple of directional warped grunges, and play with the levels. This workflow makes Substance 3D Designer feel more toy-like, as you don’t need to go too deep into detail.

6. Substance Designer to Unreal Engine

Let’s set up a template to export a Substance 3D Designer material to UE5. In order to get these textures to function as intended in Unreal, we’ll need to create a new output to pack channels. 

  • Firstly, we should have all of our finished maps in their correct 3D view outputs. That means having a completed base color, normal, roughness, ambient occlusion, height, and metallic maps. 
    • Note that the final height map connects to the AO, Roughness
  • Let’s add an “RGBA Merge” node, and a new output called “ORH”.
    • ORM stands for “Occlusion, Roughness, Metallic.” the standard PBR packed method for Unreal Engine
    • I want to optimize my textures, so I change my output to “ORH” (Occlusion, Roughness, Height). Because I am not using metal maps, I replace metallic with height so I have immediate access to it when vertex painting with height blends in Unreal Engine
  • Plug AO into R, Roughness into G, and Height into B. Use a White Grayscale as the alpha.
  • Take a look at the right side of the screenshot to see what settings you need when making a new output. You need a label, identifier, group, and components. Copy mine!
  • Right-click on your graph, and select “Export Bitmaps”. You need your base color, normal, and ORH. I also export the height map by itself because it must be a single texture to work as a Parallax Occlusion map."

"Extra Tip: Get comfortable with the Slope Blur Grayscale node with Max Samples and Low Intensity. Try combining a brick pattern with Gaussian Noise. Try combining a grunge map with a blurred version of itself. Try combining a muddy noise with a Clouds 2 node. Try combining a Perlin Noise with a Crystal 2 node. All these crazy combinations let you chip away, distort, warp, and inflate your height maps in ways that will completely change the way you texture in Substance Designer. It’s how I achieve distorting the edges of height sculpts, simplifying the detail in crazy noises, crease noises, and much more.

There are dozens of other methods to create the entire material library, which I unfortunately cannot cover in a single breakdown. I consider the material development the highlight of this project, and I learned a ton about Substance 3D Designer in the process. I made over 15 simple yet delightful materials in just a week! If you want some good resources to learn it, I recommend Adobe’s Designer QuickTip series, 3Dex’s Material Timelapses, Johnny M’s YouTube Channel, and Javier Perez’s Substance 3D Designer series on YouTube.

For this project, I decided to create a pretty complex master material in Unreal Engine 5. The goal was to create a shader that can be reused in personal projects. I wanted to create a system where a material instance could provide everything I need to texture an asset within Unreal Engine for any possible scenario, like a mini Substance 3D Designer. Ambitious!"

"Unfortunately, I won’t be showing the whole graph/how to create the shader piece by piece because it would be quite impossible in this format. Maybe I’ll make a video one day. However, I can break down its features and showcase its flexibility. 

  • 4 Layer PBR Vertex Painter
    • I have my Vertex Paint channels going through two custom Material Functions that allow you to blend your channels with a mixture of stylized inputs & controls as well as the default height lerp. This creates both a realistic height blend between materials and adds grungy noise transitions in the style of your choosing. I also have a couple of extra controls for adding a shadow underneath the top most active layer."
  • "Because its blending system is a little complex, experimenting with the material instances led to a lot of happy accidents that made the final cut. You can get some very interesting interactions between all of the blend controls. The noisy edges are derived from the RGBA channels of my brushstroke generator in Substance 3D Designer."
  • "2 UV Maps, Z-UP, Extra Normals & World Aligned Blend
    • The UV map setup allows switching between two UV Indexes on either the base material or the extra material layers and swapping it in real time. This is incredibly important when you have one UV map mapping your tileables to a mesh, and another UV containing the bake data for either Macro Normals or RGBA mask editing.  I’ve also included a Z-Up functionality in the 4th vertex paint layer."
  • "Using some UV coordinate magic, we have complete control over adding Macro and Detail normals on specific UV maps of the object without a hassle. I built a new version of the entire master material with texture objects and world-aligned blend coordinates with optional access to UV mapping for when I need to construct a scene with various large structures like cliffs and ruins. It shares nearly all of the same functionality as the UV-based shader, so I’m proud to have built these tools for my arsenal.
  • Brushtroke Overlay & Gradient Overlay
    • You can map both a brush stroke overlay texture and a gradient texture with controls to offset, tint, and contrast. Both features are projected with WorldAlignTexture and AbsoluteWorldPosition. These two overlays allow you to unify the colors of your objects and materials in a pretty stylized manner."
  • "Parallax Occlusion Mapping
    • This feature allows us to use a heightmap we had created in Substance 3D Designer to fake realistic depth in our materials. Materials painted on top will inherit the parallax occlusion mapping. There is an option to turn it on or off without breaking any of the work done on the height blending for vertex paint!"

"There were a couple more shaders I needed to get to the finish line: Stylized Fog, Stylized Water, Landscape RVT shader, and Foliage shader.

The Stylized Fog shader allowed me to get more control over the range of detail I wanted at a distance, as well as its tint. I created a material function to receive and edit the SceneTexture and SceneDepth. By dividing SceneDepth by a scalar called Distance, we can define how far we want the SceneDepth to reach, and then use that as an alpha to Lerp between the Scene Texture and a color. I then use this as a PostProcess material in the PostProcess settings."

"The Water shader was derived from a tutorial from Rimaye on YouTube. This is a great shader with a lot of nifty nodes for artistic control while providing enough features to pull off a convincing effect. It uses panning, normal distortion, distance mesh fields, scene depth, and more to get the effect looking good."

"The Landscape shader as well as the Foliage shader (and foliage modeling principles) were originally replicated from the amazing tutorials of Victoria Zavhorodnia. She has a video covering Runtime Virtual Texturing for the grass using the Landscape colors. She also has other videos iterating her foliage shader with her tree modeling videos. Here is her channel! I expanded upon the landscape materials to allow for more PBR materials, Height Blending options, and an optional toggle to introduce a rock material depending on the slope of the landscape’s surface."

"I also expanded upon the foliage shader in small ways to get a few more controls like optional PBR normals, a Billboard Scale option, and Shadows based on Vertex Normals. The Landscape Grass uses no contact shadows or raytraced shadows so that it blends with the landscape better. You can get distinction in the grass shapes with the colored wind option!"

"This project was an amazing learning experience when it comes to shading and texturing game assets with procedural methods. Utilizing the flexibility of Substance Designer to create appealing textures for complex Unreal Engine 5 shaders will let me create a ton of variation in duplicated assets, create stylized landscapes, and allow me to tackle different texturing challenges within the same shader. It’s a very personal accomplishment! I hope to implement more sculpting in the next project so I can utilize the macro normal feature; as combining vertex paint blending with unique sculpts will make for some lovely assets."

Finally, let's take a look at the lighting and rendering workflows. Wallace says the lighting was fairly simple for this project. He didn't use any extra lights other than environment lights.

"1. I added a directional light and a sky atmosphere to get the sun’s direction and exposure working correctly (later in post-processing, I set the Auto Exposure off and Exposure Compensation set to 0.7.) I’ve included the settings for both the directional light and the sky atmosphere in this pass. I used a minimal amount of indirect lighting because high amounts would break the foliage shading with ugly noise. I’ll be doing more research on workarounds for that."

"2. This is the sky light and Exponential Height Fog pass with settings included. I wanted to make the lighting as natural as possible without pushing the colors of these lights too much, so most of the lighting relies on how Lumen reflects global illumination when interacting with the volumetric clouds. The Exponential Height Fog has Volumetric Fog on and a slight emissive boost."

"3. When turning on the cloud interactions in the directional light and sky light, you get a very nice interaction between the sky atmosphere, clouds, and global illumination. It’s amazing to see a simulation of light like that in a real-time renderer. You can open up the cloud’s material instance to change the form of the clouds with interesting layers and shapes. I’ll leave my settings below in this Volumetric Cloud pass."

"4. The post-processing was a little bit of everything. The only custom feature was the stylized fog shader applied as a post-process material. Even though the adjustments are subtle, it completely transformed the final presentation. High Aperature, Sharpen Filter, and Detail Strength work together to boost the amount of visual information in the final image. I made sure to boost my Lumen Quality settings as high as possible before rendering."

"5. I use the Movie Render Queue plug-in to brute force a higher-quality image and more control over the export settings. You can assign console variables, create a custom resolution, define the graphic fidelity, define AA quality, and more. To get to the Movie Render Queue, install the plug-in, then click the render sequence button in the Sequencer. It will now automatically take you to the movie render queue!"

"Extra Tip: As the lighting evolved, I would often have to re-adjust materials more sensitive to changes in light like the foliage, water, and landscape. Even if it’s not entirely physically accurate lighting-wise, don’t be afraid to change up your materials, lights, and settings to achieve the look you’re going for. For example, the rocks on each side of the island have a different color grassy top to blend better with the landscape mesh in the final lighting."

Wallace also shared the project's "postmortem", saying that creating this project in just a few weeks seemed like a miracle.

"It was the culmination of both the 8 weeks it took to create a practice environment beforehand, the 4 weeks of absolute focus and dedication that miraculously took hold of my life, and the years of learning little tricks along my 3D art journey to get faster and start being more creative in the way I make art. It felt like every problem I solved was a huge stepping stone to my own personal limitations as an artist.

I had many sleepless nights as a beginner trying to understand the plethora of concepts for 3D environment art and how they all apply in a production setting, and with this, a ton of questions were answered. Understanding the relationship between all of the skills needed to make this was very overwhelming though. shaders, materials, modeling, architecture, foliage, stylization, procedural authoring, lighting, etc. I lost a lot of sleep making this, but I didn’t give up! I didn’t want to let myself down, but there was still the possibility that even if I tried my best, I might not be able to succeed.

With the countdown at basically zero, I finished the environment, rendered it out, and published it. The reception was way more positive than I could have imagined! There were a lot of nice comments and support; a first for my 3D art. I was obsessed over what I didn’t have time to do, and what I could be better at, but the audience enjoyed it for what it was, and that’s something I’m extremely grateful for. For a hungry artist, the positive reception after many many months of grinding to reach this point felt like breathing air for the first time in a long while. I’m even more over the moon that I got to talk all about it with you. 

I tried so many new workflows and ideas that the probability of this deadline working out was basically 0%, but I found a way by just making more time. The past few months have pushed me further than I ever thought I could handle. I didn’t know if I was really capable of creating something like this from scratch. I pushed myself to the limit before realizing if I wanted to achieve the outcome desired from my work, then I’d have to do it all over again, pushing my mind and body even further. This project’s story is a reflection of perseverance, and it’s rewarded me with the knowledge and tools needed to make my next piece of art even better. The workload, as unsustainable as it felt, gave me the foundations needed to take on future challenges with less confusion, worry, or doubt. 

My biggest advice to artists is to simply not give up your dream. If you’re looking to get into the games industry as well, then you’ve already made the commitment to your passion. It will get tested and put through the trials of fire if you’re anything like me. Every time you improve, you’re going to see new flaws in your own art. It can feel impossible to master all of the different software, all the different things you’ve gotta be a pro at.

I can’t tell you how many nights of fun an artist has to sacrifice to get good at their craft. In some seasons, you’ll work at it sparsely. In others, you will live and breathe by your art. You have to if you’re going to make it in this industry. There’s a ton of amazing artists and it’s a privilege to join them in making amazing games and make a living doing what you love in the entertainment/games industry. You’re going to get told, “No.” a lot, way more than you could have ever imagined. Especially in these times, where the games industry is reorganizing leaving countless talented artists in uncharted waters, it can seem like there’s no hope of breaking through.

Breathe. Take care of yourself. When you’re ready, get back to making art for your own sake. Make it because you want to prove to yourself you can make it. Do it again enough times, and the fruits of your labor will show. After I lost my first job as an artist last year, I thought it was time to call it quits for a while, but I picked myself up, took a breath, and started the grind all over again. Since then, I’ve worked as an artist for free, I’ve picked up a day job, and I’m in school again. That can be rough. Now, even while still looking for that opportunity to work as an artist, I can say that all of those experiences led me to grow my own art, work ethic, and skills further than I could have imagined. Learning to take care of myself as a hard-working artist while still paying my dues has been a formidable challenge. But I won’t give up, and that’s why I’m so excited to see what’s next. Keep going, brighter times are ahead! 

It was a great honor to talk about art, tech, and life with you all. I hope I get to do this again for an even grander piece one day. Check out my ArtStation, LinkedIn, or Instagram. Thank you again to 80 Level for the wonderful opportunity."

Justin Wallace, 3D Artist

Interview conducted by Gloria Levine

Join discussion

Comments 0

    You might also like

    We need your consent

    We use cookies on this website to make your browsing experience better. By using the site you agree to our use of cookies.Learn more