Creating a Fully-Procedural Material Based on the Colosseum In Substance 3D Designer

Pablo Blanes has walked us through the Roman Colosseum project, sharing how the procedural 3D material was made and detailing his workflow in Substance 3D Designer.

In case you missed it

You may find this article interesting

Introduction

Hello everyone! My name is Pablo Blanes, and as I mentioned in the last interview, I am an Environment Artist specializing in texture and environment art. I come from Madrid, the place where I started my entire professional career.

I'm still pursuing my passion for art and constantly striving to learn and improve my skills. The world of video games and the creative process behind them has always captivated me, which is why I find it interesting and enjoyable to work on personal projects in my free time. These projects not only motivate me but also help me build my portfolio and enhance my daily tasks at work.

Currently, I'm still working at Ubisoft as a Texture Artist in Montreal. I am grateful to be a part of this company where I get to work on incredible projects alongside talented and amazing people.

Texture art is my true inspiration. I like the process of creating different surfaces, paying attention to details, and trying to achieve a realistic atmosphere. Above all, I love collaborating to compose beautiful worlds.

Substance 3D Designer

Substance 3D Designer has been the main tool that I used for this project; it's no secret that it is a powerful software. Exploring the things that can be done with it is truly entertaining, and you may even discover new workflows you were unaware of. Usually, when I work on such projects, I always try to look for fun and original ideas. The fun part is important because these projects are usually done in your free time, so you have to make sure you have enough motivation to push it till the end.

Substance 3D Designer, a widely used tool in the gaming industry, offers a lot of documentation and tutorials online. Its fast approach, ability to create multiple versions, and non-destructive workflow make it ideal for incorporating feedback or making changes during production, which is quite common.

To feel that you have experience in this software, I think it's a bit like everything else, a lot of practice, trial and error, and learning the workflows until you get them almost without having to think about them.

There are many ways to solve a texture or to approach it to reach the desired result. I think it is always beneficial to have several tools, which you can combine to reach the best result. Depending on what you may need, the combination of ZBrush and Substance 3D Designer works very well too, and I think that by knowing both tools, you will always be able to keep the best of both.

The Colosseum

What was the purpose of the Colosseum? What was I trying to achieve with it?

For this project, I aimed to create something original while procedurally using Substance 3D Designer. The primary purpose was not to design a material for video game production but rather to create something that people could interpret and understand its form.

I contemplated various ideas, but when I came across a picture of the Colosseum, I immediately recognized its structure as a perfect fit for Substance 3D Designer. The pattern of different entrances and the orderly arrangement of stones made it an ideal subject for exploration.

My main goals were:

  • Creating the believable Colosseum, even though not perfect, but good enough for people to know what it is.
  • Having a realistic surface.
  • Making it all procedural, with no modeling involved, all in texture.

As always, the first step was gathering references – obtaining various images of the landmark from different perspectives and angles to ensure a comprehensive understanding of its true form.

Also, I researched multiple websites to get precise details, such as the exact number of entrances and windows found in the real structure. I aimed to gather as much information as possible.

I got some general views with different settings. Some were more to see the detail of the stone and the surface itself. The others were more to show the grandeur of the building. Because my intention was more to test how far I could go with the software, my idea was not to build scenery, it was more to show the "material", without a composition around it. Still, I wanted to make the material look interesting, lose that material feeling, and make it look more like a 3D model.

To begin the creation of the material, the first step was to establish a shape to project my Height Map onto, enabling me to understand what the final texture was going to look like in the end. I opted for a simple cylinder that was roughly adjusted to match the proportions of the monument. The rest of the "modeling" would be accomplished through the Opacity Map and the Height Map. From there, the entire process was done within Substance 3D Designer.

Getting Started

My setup for Substance 3D Designer was standard, basic outputs, such as Diffuse, Normal, Roughness, Metallic, and Height Maps, and added opacity to be able to "hide" the geometry wherever I wanted. The opacity would let me hide parts according to the shapes I wanted and give the texture a more organic feeling.

Having a super sharp micro surface detail wasn't the purpose of this project, but my objective was to get a good feeling from a certain distance since it was only gonna be one texture. So to get a better resolution, I decided to use symmetry in the UVs, to be able to get the maximum amount of pixels, optimizing the maximum data for the detail.

This way, I would be able to "fake" the entire building, capturing the essence of the cylinder shape and using the texture wisely to get the highest possible resolution.

The first important detail that caught my eye was the number of arc entrances in the Colosseum. After I searched for some information on the Internet, I discovered that I would need to have 80 holes per row. This became the initial focus of my work, adding them to the Height Map. While I also incorporated additional shapes around the holes, it was important for me to conceal the geometry using the Opacity Map, ensuring that the composition was functioning as intended.

I tried to avoid creating nodes that would repeat the same action. So for the holes, I used the same tile sampler, just using a simple transform to be able to put them at the desired place of the texture. After placing the first holes, I started incorporating elements, one by one. I "divided" the modules, creating each shape separately, and later, adding it to the main flow of the texture. All the shapes would use a tile sampler using the same quantity in the desired axis to fit the holes. 

I tried to keep an organized flow, to be aware of where I was adding the elements. I used height blend to add some elements on the Height Map, but at the same time, I was able to have a mask that I would use later to incorporate some color and roughness data.

When creating the main shapes to decorate the Colosseum, I tried to keep it simple. Since I was going to pack a lot of information into a single texture, I thought it was better to try and "adapt" the scale of the micro-surface details a little bit. My goal was not to achieve high resolution in close-up details. Therefore, I initially created the different shapes with a cleaner surface, intending to add the intricate details later on.

I relied a lot on using the Cartesian to Polar transformation. This approach worked exceptionally well for creating shapes that would fit onto the main arcs. I found it easier to create these elements in a "flat" or "straight" state, allowing me to bend them as needed and seamlessly align them with the arches or other corresponding elements. Most of the tile samplers were duplicated from the preceding ones to preserve the configuration and ensure a perfect fit within the Height Map.

In terms of shape creation, the Curve module was another node I frequently used. It proved highly effective for designing architectural pieces. Although creating a Height Map with basic shapes and subsequently smoothing it using Transform nodes can also work, for more complex shapes, I prefer using the Curve node.

It is very handy with curves, easily editable, and helps to be very precise with the shape we want to create. It saves me from having to mix between different shapes, and possibly, the result, for specific cases, is even better.

All of these elements were created using a Tile Sampler with specific settings that would make everything fit. Depending on the desired level of detail, I would sometimes make minor adjustments to values such as scale and rotation.

Studying pictures of the original structure made me think about what elements I could do and which elements would be too complicated to create. I had to keep in mind that I intended to do everything procedurally, based on nodes and without modeling. Therefore, I decided to focus on certain elements, and I divided the building into two main parts.

If we analyze the Colosseum and simplify its volumes, we can identify about three levels of depth. However, the more depth levels I had, the more limited I would be in terms of putting details to each layer. Also, I wanted the material to have a slight "thickness" to it once the tessellations and displacement were applied. Therefore, I prioritized having these details and opted for one less layer. Nevertheless, I think that the silhouette of the final result would easily convey the intention behind this project.

So, in summary, the Height Map would consist of two main layers that would significantly differ from each other in the final render. Each layer would be filled with plenty of details while maintaining some distance between them to create an interesting visual effect and enhance the sense of volume.

To replicate some parts of the Colosseum, I deduced that a brick pattern would be necessary. This pattern would closely resemble the real structure and add detail to areas that might appear flat otherwise. The process was quite simple – I used a Tile Random node to generate some randomness in the pattern and then used the Flood Fill node to get a grayscale mask. Additionally, I often use a Distance node to create a mask without the black outlines between the bricks (although I could add them if needed). It was also within this step that I created a damage mask for each brick or element, adding a layer of detail and storytelling to the texture. Since this was applied to all elements after they were generated in the Tile Sampler, repetition or tiling was completely avoided.

Using the grayscale mask generated from the Flood Fill allowed me to add some depth between the bricks, resulting in a more visually captivating surface. When combined with the subtle damages in select corners, it added the final touch to the texture. The majority of the Colosseum was created using these nodes, with parameter adjustments made based on the size or shape of each element.

Another node that greatly helped me, especially in combination with the brick pattern, was the Flood Fill Mapper Grayscale. This node effectively applies a type of noise to a pattern within a grayscale mask. I intended to accentuate specific areas of the bricks that stood out in the references, while also altering their color tone.

In the photo, you can see that certain bricks change color as a group. 

First, I created a Tile Sampler with a basic shape. This defined the areas within the brick pattern where I wanted them to be more visible or to have a grayscale mask incorporated. Combined with the Flood Fill Mapper node, it generated a grayscale mask based on the input source, directly affecting the pattern. This proved highly useful as it allowed me to extrude, change the color, or introduce variations in the bricks while ensuring a seamless fit. Whenever I needed a specific mask or desired some controlled randomness within a pattern, I relied on the Flood Fill Mapper.

For the organic rock elements, I intensified the scale of the noise. These stone pieces were positioned within the arcs, featuring varying sizes and heights. Adding this detail was essential to create contrast between the more "architectural" and straight volumes and the slightly more organic appearance of these elements at first glance.

The process would start in a fairly simple way, using a Tile Sampler to fit everything with the same parameters that I used for the graph for other elements, and little by little adding the noise and the breaks. I tried as much as I could to give some organic feeling, with some randomness, and keep the Displacement Map more or less at the same height as the elements around them. If I went too intense or bright on the Height Map, these elements would stand out too much.

I like to keep the brightness values high when working with the Height Map to better observe its behavior. Once I am happy with the shape, breaks, and other small details, I usually include one last level to clamp the values and adjust them as needed. For the rocky elements, I combined multiple gradients in different directions to achieve a more realistic shape, without going overboard. The noise was added after creating the shape and scattered using a Tile Sampler.

We could say that most of the noise in the material was upscaled. To prioritize the overall appearance, I made some details larger to have more pixels per element and achieve the highest possible resolution. While this may not be 100% realistic, my main focus was on how the material would look from a distance, rather than up close.

Little by little, I added all the elements I created, completing the Height Map. When I first started using Substance 3D Designer, I did not rely heavily on using Dots, but now I find them extremely helpful in organizing my work and quickly locating elements, masks, or nodes I may need later on. Once I had the Height Map, I proceeded to create the Diffuse Map and Roughness Map. Usually, I derive the Normal Map directly from the Height Map, unless there is a specific need to work on the Normal Map separately.

For the Diffuse Map, I distinguished between two main color palettes, taking into account the contrasting depth in the Height Map. The first color palette corresponded to the area highlighted in green in the image. It consisted of more desaturated, cream-like colors, along with some darker shades to represent certain dark spots found on the real building. However, this palette also includes some vibrant and eye-catching tones. In photos of the Colosseum, I noticed that certain parts stood out for having a bit more color, even though it was not predominant overall.

The second color palette corresponded to the part of the Colosseum that appeared to be in worse preservation, displaying more damages or ruins. This palette mainly consisted of warm tones ranging from reds to oranges and cream colors.

Building them separately lets me prioritize some details or elements that the color palette or area may need. In the more desaturated color range, I would prioritize:

  • Different values in the bricks (to add some interest and remove a flat effect in the color).
  • Some leaks under the protruding elements.
  • Dirt spots on the edge of some bricks, etc. 

You can also see two quite large stains, which would represent stains found in the real building, staining part of the facade of a different color.

In the second range would predominate:

  • The contrast between certain warmer and livelier values with the columns and arches which would have a more neutral or desaturated value.
  • Highlights some protruding bricks that would have a more washed color.

Also, I checked how the colors interacted with different lighting setups in Marmoset Toolbag. Since I planned to render the final images using this software, I made various adjustments in the main graph to achieve the desired result. Certain areas of the Diffuse Map were left untouched or contained noise that did not make sense, as these areas would be hidden by the Opacity Map.

For the Roughness Map, I opted for a simpler approach. I incorporated overall values with subtle differences, used grayscale masks to generate variations in the brick patterns, and added additional roughness information to the occluded parts to enhance the sense of depth. I began with a Gradient Map as the base for the Color Map.

With all my maps prepared, I was ready for the rendering process. I chose to use Marmoset Toolbag 4, as I thought it would provide better results compared to Marmoset Toolbag 3, thanks to the inclusion of Ray Tracing. While my final renders would showcase the Colosseum on its own without any surrounding elements, I wanted to convey a sense of scale and grandeur in the monument. Ray Tracing and Global Illumination would greatly assist in achieving this effect, enhancing the realism of shadows and creating a visually captivating image. Additionally, the tessellation feature worked more effectively in Marmoset Toolbag 4, resulting in improved performance overall.

I work with Directional Lights for all of my renders. Usually, I would use a main light that affects the overall composition and perhaps add a subtle tint in a specific color. Additionally, I incorporate a second directional light, often positioned to create internal lighting within the Colosseum. My main focus is to ensure that the volumes are well-defined, there is color variation, and most importantly, the renders do not appear flat. I aim for the renderings to have a strong sense of three-dimensional modeling rather than resembling a textured surface with tessellation.

After capturing the images in Marmoset Toolbag, I often like to make slight adjustments to the values, levels, and perhaps the saturation. Depending on the desired outcome, it may be more beneficial to increase or decrease certain parameters. While most rendering engines offer options to adjust contrast, saturation, and add noise, I prefer to make these tweaks in post-production. This allows me to avoid re-rendering, offers more control, makes editing easier, and ultimately speeds up the process.

It can make a huge difference. In conclusion, what I usually add in a render to modify in the post-process is:

  • Contrast/Brightness.
  • HUE/Saturation.
  • Highpass Filter with Overlay blend Mode (with a low opacity).

Depending on the reference, I sometimes modify things, and other times I do not. Sometimes the modifications are subtle, but overall, I strongly believe that they make a significant difference in the final result.

Conclusion

I love finding time to work on my personal projects. I think it helps me a lot to nurture my creative side, improve my professional work, and keep myself motivated to do what I love. Creating something that is both complex and interesting, with the potential for a nice outcome, is what every artist pursues when working on a portfolio piece.

Once again, I would like to express my gratitude to 80 Level for this incredible opportunity to share a breakdown of my project. I hope you find it interesting!

Thank you for your time!

Pablo Blanes, 3D Environment Artist

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