Stefan Zeibekis shared the workflow behind the project Smithy, told us how to turn a 2D pixel-art concept into a stylized 3D diorama.
My name is Stefan Zeibekis and I am currently looking for a Junior Environment Art position. I started studying Digital Game Art in October 2018 at Games Academy Frankfurt. There I learned a lot about game development through the semi-annual game projects. I started focusing on Environment Art in my fourth and last semester and graduated in September 2020. While at Games Academy I had a part-time job at metricminds in the facial motion capture department, working on WWE 2K20.
The programs I use are 3ds Max, ZBrush, Photoshop, Substance Painter and Designer, and UE4.
When I started the project, the only thing I knew, was that I wanted to make a diorama. Something with a small scope and ideally a concept I could work from. In the end, after browsing through the Internet, I found a pixel art smithy on ArtStation by Murilo N, which immediately inspired me.
At this point, I already failed at my plan to use a concept. But it didn’t matter to me, since I knew now what I wanted to build and all that was left to do, was gather references of real smithies.
When gathering references, I think it’s a good idea not to overwhelm yourself. It’s fine to start with many pictures, but when starting to work off of them, you should break it down to just a few. Otherwise, you could end up with a weird mix of everything which doesn’t fit together. A tip from my partner which really helped me was that when searching for references, you shouldn’t just search for real-life references, but also get one or two pictures of already existing 3D models. This can help to figure out how others approached what you are going to do.
While gathering all the references I like to write my asset list and figure out how I’ll approach everything. This helps me to get a feeling of the scope and maybe cut some things right from the beginning. I then start to prioritize everything and make a rough plan for deadlines. Usually, I start by creating larger things like, in the case of my smithy, the walls and the ground texture. This helps me to see bigger changes/progress in my scene and keeps me motivated. Though if I don’t feel motivated to work on stuff with higher priority, but really want to model a small prop, I am going to model the prop, because having fun with your personal projects should always be the most important thing.
Blockout and Setup in UE4
Like most people know, creating a blockout is great to quickly iterate and get a first impression on how your end product will look like. When I create blockouts I also like giving everything a base color and roughness value, instead of just a color, I sometimes use free textures that are close to what I want in the end. This helps me get an even better first impression. In the pictures below you can see how I actually modeled the brick wall out of beveled cubes. Do whatever feels right to get a good feeling of your scene, while being able to quickly change things up if needed. For this stage, I also like to just use assets from my old projects, even if they don’t fit 100%.
When I was happy with my blockout, I gave everything a quick UV and imported it into UE4. There I created my master-materials. I started by creating one for tiling textures, one for unique textures, and one for foliage. In my tiling textures, I set up vertex painting and overlay a grunge map to break up the hard lines that could come through basic vertex painting. I expose different parameters to change the tiling, base color, and roughness values as well as the normal strength for each texture. I also do all of this for my unique textures, except for vertex painting and tiling. In my smithy project, I also added the possibility to change between UV channels 0 and 2. Later I'll explain what that is used for.
Now that everything was set up and planned out, I felt comfortable with creating the final assets. Like I said before, I usually start by creating big shapes, to stay motivated. So I started with the brick wall. I knew it was going to be a tiling texture on a simple mesh, but I also needed real geometry bricks which I could stack on top of the edges of the open part of my walls. For these, I just took some bricks from my high poly, created low poly versions of them, and baked the high poly details. Since I created the textures for the brick wall in Substance Designer, I just had to plug in the baked textures from the unique bricks into the same graph and automatically had bricks that fit in perfectly with the tiling texture.
I learned this from Martin Teichmann’s tutorial on The Gnomon workshop. If you want to learn more about Environment Art, I highly recommend getting a Gnomon membership for one month to follow his tutorial.
Apart from creating base materials for wood and metal in Substance Designer, I decided to sculpt some unique wooden objects and use those to create several other assets, like, for example, the wood stash or all wooden elements on my walls. You can easily bend and slightly scale the wood parts, without distorting the UVs noticeably.
For these meshes, I set up the switch to the second UV channel in my master material. I was now able to use the unique Normal Map of the wooden objects and give the assets an AO map through the second UV channel. For some, I even made a unique base color and Roughness Map. Approaching many assets this way, helped me save a lot of time.
For the smaller props, like the pliers and hammers, I used unique textures by modeling the low poly in 3ds Max, adding some high poly details in ZBrush, and baking in Substance Painter. How many assets I put into one texture depended on the set’s Texel Density.
Texturing wise I kept it simple. I applied my base material from SD, then started to add color and roughness variations, edge wear, dirt, and sometimes a bit of dust. I like using Smart Masks, Add Fill with Grunge Maps and Add Levels to achieve what I want. Just play around with the parameters.
When I create my tiling textures in Substance Designer, what I like to do is look for tutorials that I mix and change up in a way that fits my project. As a general rule when creating textures in SD, it’s a good idea to first create a Height Map and from there you can create all the other textures.
For creating my pine tree bark texture I used the Stylized Bark Material tutorial by Kalyson as a base. Then I got some refs from real bark and changed up the material of the tutorial. Simply put, I used a tile sampler with edge detect to get the main shape I wanted. Then through chipping away some parts of the edges and warping the shape I got more detail. Pine bark often has some layers on top, which peel off, so I wanted to put that into my material. For that, I created a mask, further chipping away some parts and using a Level node. This mask I was then able to use for further height detail as well as the Diffuse Map.
For your Diffuse Map, if you have a texture with multiple components, like, for example, pebbles, grass, and the ground itself, you should create a color for each component separately and blend them together in the end. Don’t try to colorize everything with one gradient map. To have more control over the base color, I use an HSL node at the end.
I don’t know if I got the setup wrong, but the base color from Substance Designer always gets exported as a 16-bit texture. This leads to the issue that my texture is way too light in UE4. If you have this issue as well, the workaround I found is plugging the base color into a Level node at the very end and changing the “Output Format” from “Relative to input” to “Absolute”. That way your base color will be exported as an 8-bit texture.
My exterior ground texture was made with the help of Jacob Norris’ free Forest Ground tutorial. Since I used his workflow for it, I’ll just recommend getting his tutorial, instead of explaining every little step here. The short version would be to create some basic tiling ground shape in ZBrush, create meshes you want to scatter on your ground, and use the NanoMesh function to do so. Export with Grab doc and get some variations in your texture with Photoshop.
Creating the foliage was pretty straightforward. I collected references of grass and ferns and started sculpting. First, I made a single grass blade. I didn’t just sculpt it but also gave it some base color in ZBrush. Although you would never see the grass up close, I also like adding some small details to it, since you notice the difference even from far away. When I finished the grass blade I simply duplicated it and gave it slight variations. I repeated this two more times and created a dry grass blade, as well as a broken dry grass blade. Since grass in nature often isn’t just the same grass blades over and over, I also added a taller variant and panicles. Creating the panicle is the same as the grass blades. Check your reference, split it into the components it’s made of, and in the end assemble everything. When all were done I started assembling them into grass clumps.
For my tree and ferns, I used the same technique. While sculpting I recommend switching between different materials from time to time. Since they show highlights differently, you will get a better feeling of the actual shape of your sculpt. Also, when coloring your mesh, especially when doing foliage, I really like using the SkinShade4 material. While it shows almost exactly the true color you’re painting, it also still slightly shows you the three-dimensional shape of the mesh, unlike the Flat Color material. When exporting the textures, I export the base color with the Flat Color material, normal with NormalRGBMat, and a mask with Flat Color, while turning the color option off for my meshes. Exporting a heightmap can help in creating the roughness texture in Photoshop. Since the mask you export from ZBrush probably won’t be perfectly black and white, I put a level adjustment on it in Photoshop.
The rest of the process is quite simple. In 3ds Max I create a square plane and put my base color and opacity mask on it. Now I start cutting out the parts. While cutting I try to get rid of as much opacity as possible. Having a few more tris is not a big deal, since they cost almost nothing, while opacity is a lot heavier. When everything is cut out, I push some vertices around to get a more three-dimensional feel in my foliage. For this project, I didn’t plan on putting any wind on my foliage so I didn’t apply any vertex color to the meshes. After assembling the planes to grass clumps, the last thing to do is get the vertex normal direction right. For that, I use the free NormalThieve script. For grass, I prefer to steal from a plane, instead of a hemisphere. When you steal from a plane all your normals will point straight upwards, which gives you the advantage that the grass will be lit the same way as your ground and blend nicer. For ferns and trees, I use a hemisphere.
When assembling a tree in 3ds Max it’s important to consider what the player perspective will be. In modeling programs, you usually tend to work from a top-down position and then wonder why your tree doesn’t look the same in the engine from a first-person perspective. To avoid that, just constantly check from the player's perspective in your viewport. This of course applies to everything.
My setup for the foliage in UE4 was pretty basic but instead of just plugging the Diffuse Map into the base color output, I added the Speed Tree Color Variation node which gives every instance of foliage a slightly different color. You can control the amount through a parameter. I learned about this in one of Quixel’s tutorials.
Lighting and Post-Process
Early on in the project I already had a mood in mind, but since I don’t know a lot about lighting I asked my partner Isabel Seitz, for some tips about how I could approach it. In the end, I chose to use a slightly blueish Directional Light as my main light source and a Sky Light with an HDRI from HDRIhaven. Since the shadow areas were still really dark, I decided to add a counter directional light with a slight orange tint. I set the intensity of that light pretty low, so shadows are just slightly lighter.
The interior is lit by two-point lights. One inside the furnace and one in the middle of the room with cast shadows off. Both are set to static. A few places were still a bit too dark, which I solved by placing spotlights with low intensities.
In post-processing, I barely needed to do anything. I only adjusted the exposure, put a slight vignette effect on it, and slightly pushed the saturation and contrast.
When starting this project my main goals, apart from creating something for my portfolio, were to learn to take my time with every asset and not to rush. Also putting more effort into pre-production. Until now, I always just rushed into everything and wanted to begin the project. Now I learned that spending a day or two to really plan out everything actually speeds up the process, while also helping you to improve your quality because you know what you want to build. Another thing I learned through this project is that sometimes you just have to start doing it. In the past, I often thought “there has got to be a better and smarter way to do it”, so I hesitated to do it the way I knew would work and sometimes even just didn’t do it at all.
Finally, I just want to thank everyone in the DiNusty and EXP community who gave me feedback. Special thanks would be to Isabel Seitz and Martin Teichmann, who also always gave me feedback and pushed my smithy and skill to the next level.