Creating UVs and Tileable Textures for a Snowy Victorian Street

Aleksandar Danilovac discussed step-by-step how he created Victorian City Street, a UE4 environment made in Maya, ZBrush, Substance Painter, and Substance Designer.

In case you missed it

You might find these articles interesting


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.

1 of 5

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 3: Beveling. After adding all the secondary and tertiary details, it’s time to bevel. This is the part that I really enjoyed because you can slowly start seeing the progress you made. The general rule of thumb I used when beveling is to bevel everything roughly twice as big as I usually would. Chunky bevels read better from a distance. That being said, it’s really important to differentiate the material of the mesh being beveled. This is how I approached it in most cases.
Step 4: Making it uneven. Cracks, dents, chip offs, etc. These things are very quick and easy to add in Maya. Even just moving the verts and making the meshes uneven in length/width helps a lot. An example of this would be the concrete base I had under the Todd’s Whisky building storefront. This helps with making things look more organic and natural. The extra support loops are for vertex painting.

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.
1 of 3

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. 

The edge damage was later combined by using the tile sampler node with a gradient map as a mask. The gradient map works as a color map with different colors assigned to it using the tile sampler. Using edge detect with a bevel ensures that the mask is tight and there is no leaking from the other normal maps.
The result looked like this:

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. 

The next thing I did was to copy that UV set two times. Keep in mind that the first copy will actually be used by the engine as the Light Map UVs.
The final step would be to align only the faces that you want your trim to show with the texture you’re using inside of the UV set 2. The rest of the UVs need to be flattened. Deleting them won’t work because the mesh will buzz in the engine. So, the result should look something like this; I flattened the UVs by simply scaling them inside of the UV editor:

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. 

Instead of leaving it like this, I selected the face behind the trim and then shift-selected the trim mesh itself. After that, I opened Mesh -> Transfer Attributes.
Using these settings I pressed apply. 
This locks the normals of the trim mesh and matches them to whatever the selection was. Even though it looks almost invisible, you can still see the silhouette from a side angle.
This was the final look in the engine: 
Another example of where I used this technique was on all the bolts in my scene. This was a huge time saver because I simply created 2 variations of bolt meshes, and everywhere I wanted a bolt I simply used one of those 2. Another cool thing the shader from before allowed me to do, is to simply play with the trim offset parameter. This means that by scrubbing that slider I was able to get any bolt from the trim map.


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:

1 of 2

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,, 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.
1 of 2
  • 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. 
Entire graph:

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:

However, this looked kind of flat in the engine. That is when I found about this cool technique using the Transform tool in Maya, located in Edit Mesh -> Transform -> Additional options.
By using this random additional option, I got much better results. I set the number to something lower than 1 because 1 was too strong. Additionally, this tool can be used for a lot of different things like ground, dirt, etc.  

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.

1 of 3


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. 

Sun setup:

For the street lights, the setup that worked best was just 2 point lights on the opposite sides of the street poles. Additionally, I made the bulbs very bright to create this feeling of warmth. 
This was roughly the setup for the street point lights. All of them were static except for the flickering lights next to the meat shop, those were stationary. I tweaked the intensity on most of them in order for the result to be more natural.
I wanted to keep the right side of the scene more in shadow and less lit. The problem with this was that the scene became too dark and the materials started to look much worse than before. This was due to the scene mostly being lit with ambient light and not enough direct illumination. In order to fix this issue, I used cool spot lights from the sides. 
Setup for the spot lights. All of them have different intensities and different shades of blue.
Another thing that really helped with the mood was the emissive lights. A cool shader I made allowed me to control how bright a certain part is by using a linear gradient. This basically gave me the possibility to make UV cuts where I wanted the mesh to be less lit. The boolean “U” gave me the option of using a horizontal gradient. Most of the time I used the vertical one, just because it was easier for me. 
The way it works is very simple. This is a gradient linear 1 I took from Substance Designer. We can say that the image represents the 0-1 UV space. By placing the UVs of a mesh in the black part, lights are not lit and by placing the UVs in white we get fully lit lights. Another cool thing is making cuts in different areas of a mesh to get versatile results.
An example of this would the hotel sign on the center building or the Todd’s Whisky sign.
When it comes to post-processing, these were the things that I changed and used:

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!

Aleksandar Danilovac, Environment Artist

Interview conducted by Arti Sergeev

Keep reading

You may find this article interesting

Join discussion

Comments 1

  • Anonymous user



    Anonymous user

    ·3 years ago·

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