Aleksandar Danilovac discussed step-by-step how he created Victorian City Street, a UE4 environment made in Maya, ZBrush, Substance Painter, and Substance Designer.
Hello everyone! Thank you for taking the time to read my article. I am honored to have the opportunity to write about how I created my Victorian City Street Demo Reel, and I hope that some of you will find it useful.
My name is Aleksandar Danilovac. I was born and raised in Serbia. I am an environment artist currently living in Vancouver, BC, Canada. Prior to enrolling in Think Tank Training Centre, I studied Computer Science. My interest in video games started at a very young age. I always felt that my professional career would be in the gaming industry. At first, I thought that it would be in programming but then I discovered how satisfying it was to do CGI. At the moment I am looking for my first job in the industry.
Victorian City Street: Concept and Ideas
When I was starting the Mentorship term at the Think Tank Campus, I stumbled upon this amazing concept created by Rowena Wang:
What drew my attention at first was the big glowing “Todd’s Whisky” sign. After observing the concept, I felt an immediate connection with it. There are many things that I liked about it. It felt like a mystical part of a Victorian city with some steampunk elements to it.
The main reason for me choosing this concept was to work on my weak spots. I felt like I was making props for too long and created my comfort zone inside of that process. That is why I wanted to do something bigger and outdoor. Fortunately for me, Think Tank had the perfect mentor in their arsenal to help me see this project through – Johnny Malcolm. We were both concerned with the sheer size of the concept, but ultimately decided to go for it.
As far as references go, my main tools were PureRef, Google, and Pinterest. Additionally, my approach for referencing consisted of using as few references as possible, as opposed to having a lot of them. This helped me focus on one thing at a time and stop me from having too many ideas on the plate. Another thing I found useful was organizing my references into multiple PureRef files. For example, each store was a separate PureRef file, with references linked only to that particular store.
For the initial blockout, I started with the street lights because the concept has some characters next to it. I have used the Unreal Engine 4 dummy as a character size reference. The good thing about this workflow is that it extends to other elements later on. For example, I can say that the building is “n” street lights tall. The downside of it is that it’s most likely physically inaccurate. This is where referencing or searching up how tall an average street lamp is, comes in handy.
Vertical Slice Approach
My production process, after the blockout, consisted of doing “vertical slices”. A vertical slice is basically, like the name suggests, a vertical cutout of the concept. For example, a vertical slice would be doing one storefront or one building. Furthermore, this approach means doing all the required steps for production (modeling, texturing, vertex painting, etc.). This way of working on things made sure I had consistent improvement and practice on all the things that an environment artist is supposed to do. Additionally, by doing this, my knowledge and skills in all the different aspects of environment art increased at the same time.
When it came to modeling buildings, one of the first things was how to separate them in 3 different levels of detail. The first (Green) part represents the actual walls/roofs of the structure. It represents the easiest part of a building because it basically consists of planes/cubes with a tileable and some bricks popped out as actual geometry to make it more interesting. The second (Red) part represents the structural components of a building. Those would be (wooden beams, pipes, corbels, gutters, etc.). These elements can be reused in most cases, with some minor tweaks here and there to prevent repetition.
The third (Blue) elements are more “hero” unique pieces that are used to decorate each building and make it stand out.
I did not use the modular workflow while modeling this scene. The main reason for it was that each building in the concept is very unique. That being said, after modeling a couple of variations of the “red” elements, I started kit bashing them into buildings that were less significant.
After completing the blockout, I moved to detail modeling of a selected vertical slice. There were a couple of steps I did every time to ensure a consistent look throughout the scene. I will explain these steps in depth because I think they added a lot to the final organic look.
Step 1: Further referencing of specific elements. The reason why references are so important is that they make a difference in something looking realistic. For example, in the picture above, the red marked part has wooden beams that are essentially just stacked cubes that aren’t really connected to the bottom frame with anything. The thing to do in this stage is to find out how these beams would be connected to all the elements in real life. Are they welded? Are they bolted in? I tried going one step further and researching how all these elements would interact with each other. There are a couple of benefits to doing this. First of all, it adds secondary and tertiary details, secondly, it creates opportunities to use multiple materials. Additionally, it helps with breaking the tiling and achieving different specular highlights, and that all adds up in the end. Every building should have a good balance between big, medium, and smalls parts.
Step 2: Separating a mesh into multiple parts. A great example of this would be the windows. Instead of leaving it as one whole mesh, it’s better to split it. This is another example of how important references are.
Step 5. UVing. When it comes to UVing, there is a subject that I would like to talk about, and it’s related to Light Map UVs and a bonus step that requires the use of the second UV set.
One of the most important steps to getting a clean light bake is having clean and straight UVs. Considering that the default light map size in Unreal Engine is 64x64px, I will discuss an example with a 64x64px image. Light bake essentially creates gradient maps on a specific object that get multiplied with the Albedo map. Since it’s just a gray gradient you don’t really need a lot of resolution. That is where having good UVs makes a big difference. Here I created 3 simple shapes in Substance Designer. All of them are the same resolution. Let’s say that we’re observing the UVs of a cylinder. The first one on the left is the ideal case. The UVs are straight and aligned on the 0-1 UV space.
In the second one, we can observe some pixelation happening. The third one is how most cylinders would unfold by default if the UVs are not straightened. This problem is called the sawtoothing. The reason why this is occurring is that pixels are 1x1 squares, and tilting them diagonally or leaving them bent creates these “steps” which will impact the final light bake quality.
Increasing the Light Map resolution is not a way out. The solution would be to fix the UVs and make them straight. This is not the only reason why you would want to have clean UVs. Additional reasons would be:
- Getting the maximum space possible in the 0-1 UV space for further texturing
(especially important for unique props).
- Writing text in Substance Painter, etc.
The additional bonus step I took for certain parts requires a bit of preparation at first, but for a scene this big, it proved to be very time saving later down the road. The step consists of using Normal Trim maps in the second UV set.
The first thing I did was to create some edge damage in Substance Designer.
Unreal Engine Shader setup:
The first step would be creating a shader that supports the use of another UV-set. In my example, I chose to use the UV set 2. The reason for using it is that Unreal Engine 4 uses the UV set 1 for the light maps. You can use as many UV sets as you like. This part of the shader is basically telling Unreal Engine to use TexCoord(2) which corresponds to the UV set 2 in Maya and recreate its normal map by using the DeriveTangetBasis node. Additionally, I used a mask which allowed me to control the roughness and albedo and if necessary, it behaved as the metallic map.
Maya setup: After unwrapping the mesh, I decided whether or not to add normal trims to that element. In this example, I will use the trims from the Todd’s Whisky building.
The process in Maya consisted of these steps;
Firstly, I opened the UV set editor. There you will most likely find only one UV set.
A bonus step for this would be to transfer the shading attributes. This doesn’t have to be something that’s done every time, but in this case, it made a difference. Instead of using the trim normals on something flat, I tried adding a bit of geo to support it, because it looks much better with something to make it bump out instead of it being totally flat.
The problem with this is that it creates completely different shading that stands out too much. This is how it looked if I made the mesh normals smooth.
After choosing my vertical slice and finishing the modeling, I started texturing. The one thing I always tried to keep in mind was working from big to small. That meant understanding how many materials I would need to finish all the bigger parts. When working on buildings, I was maintaining a good balance between at least 3 different types of materials (wood, metal, stone/concrete). The major part of my scene was done with tileables. Another thing I used on all the elements was a detail normal map. I didn’t invest too much time into creating detail normal maps, as most of them worked fine even though they were really simple. I made a couple of variations of them. For example, I had a detail normal map for wood, metal, stone, and snow. All of them were basically just default noises from Substance Designer with some blends here and there. I kept them low resolution because I tiled them a bunch of times in the engine. Detail normal maps are really simple to create and add to the shader, but they improve the scene a lot. For creating the shader, I followed this article in the Unreal Engine documentation.
Here are some of the tileables I created for this scene:
For props, I mostly used Substance Painter. Since I ended up making a lot of props, I created a few different materials inside of Painter and used them as smart materials to speed up the process. My approach to texturing in Painter mostly consisted of doing things procedurally with some hand painting.
An example of a prop I textured in Substance Painter:
The biggest challenge in the texturing stage for me was definitely Substance Designer. I did not use any premade substances. I tried making all of them from scratch even if I watched tutorials. Luckily, there are currently a lot of good quality tutorials online. Additionally, my mentor’s specialization is Substance Designer, so I had a big head start from watching his game art classes. I would definitely advise everyone to watch some of the tutorials from Daniel Thiger, Joshua Lynch, Experience Points, Javier Perez, levelup.digital, etc.
Now I will go a bit in-depth into my Arc Cobblestone tileable, and talk about how I textured and blended slush, snow, and water puddles on it.
- I started by making a shape for the individual stone. The reason why I made the shape instead of using the predefined one from the Arc Pavement node is that I was having problems in making the gaps between each stone tighter.
- What you see below is a pretty standard setup nowadays which allows maximum control later down the line. Another benefit of this is that the levels node before the blend allows me to control how tight the spacing is.
- There were two noises that I really liked when it came to doing edge damage on stone/brick. Clouds 2 in combination with Slope Blur always gave me really good results.
- Another one is Crystal 1, which is really strong if plugged straight into Slope Blur, so I generally had to do Blur HQ Grayscale before doing the Slope Blur.
- Another benefit of doing the initial setup with Flood Fill is that it later allows a fast and easy way of doing angle and height variation. It is done through the use of Flood Fill to Gradient node, and by simply increasing the angle variation. This helps a lot especially in my case because I displaced the cobblestone later in the engine. I blended it slightly into the main chain because it didn’t make sense for it to be too wobbly, in order for the vehicles to be able to drive over it.
When I started assembling the cobblestone road in the engine, I wanted to have imperfections in the initial mesh to create the opportunity to vertex paint puddles. This is where I learned a very easy and quick technique. I started by creating a simple noise in Substance Designer. I used the default Clouds 2 with some Levels on top so that it had some unevenness. After adding support loops to the mesh, I went into ZBrush and used displacement on the mesh. That is when I plugged in the noise I created as the displacement map. I decided to make it a bit more exaggerated since it was barely noticeable in the engine.
This was the result:
Later on, I displaced the cobblestone in the engine to achieve a better look. I added snow piles alongside the outer edges. However, it wasn’t blending well enough with the cobblestone. So, I created a 3 layer vertex painting shader. This gave me the opportunity to blend fresh snow next to the piles, and slush next to the fresh snow, along with having puddles. This made the transitions look more natural.
After quickly sculpting the meshes in ZBrush this was my result:
For anyone interested in doing snow I would definitely recommend checking out this amazing article created by Leah Augustine. I learned and tried to recreate a lot of the cool things showcased there.
My approach to making tileables consisted of making a clean sheet for each of them as a base. For example, I created a clean brick sheet, and in a subgraph, I created the grout. After that, it was just a matter of using the MaterialBlend node with a mask to get the desired result. This way, when I vertex paint in the engine, the results are much more natural as opposed to blending just the clean grout with the clean bricks.
For the composition, I mostly followed the initial concept. One of the first things my mentor asked me to do was to think about the story behind the concept. I tried answering questions like "Which part of the city is this?", "Is it a rich or a poor part of the city?"
Additionally, I had to figure out what each storefront and building is going to represent. I decided to go for a fortune-telling stand, hardware store, meat shop, apothecary, a small bookstore, and an art gallery. Another good thing about this concept was the freedom of choosing which shops I’d like to create. I did a couple of iterations during the process of making them. When placing props, I wasn’t following any rules or anything similar to that. I was simply trying to group them into parts that made sense and make it chaotic. Another thing I tried to do, especially with the fortune-telling stand, was to tell a story. I tried putting myself in the shoes of a person having a tarot card reading and the person who was doing it. I arranged the props on the table with both of those perspectives in mind.
Lighting and Post-Processing
For lighting, I used physical values inside of Unreal Engine 4. This website is a very good starting point for understanding how it works. I was using regular HDRIs for almost the entire duration of creating my demo reel. One day at school, one of my dear friends and colleagues showed me this amazing pack of matte painted skies. After applying one of them, the complete mood of the scene improved.
This concept was the inspiration for the mood:
Both Sun and Sky were set to stationary.
For the final render, I found this really useful article about achieving better results for the final output.
The main challenge for this scene was definitely the sheer size of it. I had to organize my time as best as possible. Some of the most important things I learnt during the creation of my demo reel were time management and to always work from big to small. If I could choose again and start over, I would go with something smaller. The reason for it is simply learning new stuff. After a certain point, I wasn’t learning anything new, it just became a process of rinse and repeat. Repetition isn’t bad though, it definitely helped me become much faster and more confident in certain skills.
Dear reader, if you made it this far, thank you for taking the time to read through my article. I hope that I was able to show some techniques that are useful to you. If you liked this article, check out my ArtStation where I am going to post more breakdowns. I would also like to use this opportunity to thank all of my amazing colleagues from Think Tank for their invaluable help. Thank you, and good luck on your journey!