04 February 2021

Mosaic Trims – Trim Materials – Vishal Ranga



Hello everyone, I am Vishal Ranga, Senior Level Artist at Ubisoft Pune, working on Riders Republic – recently announced MMO. I’ve been in the Games Industry for about 6 years now and have worked on different roles connected to AAA levels, environment tech and art production. Material creation, texturing and shader authoring is something I love, so I keep exploring and experimenting.

Idea and References

I believe the first and most important step for any project/work task of any scale is the ‘definition of purpose’. I would not start something without having at least a vague idea of what I want to see in the end and why I want to do it.


‘Mosaic Trims’ is a personal substance project, I planned in a way that it serves multiple purposes. I wanted to try ancient style mosaic art ever since I played AC Odyssey a while ago. Trim sheets (or Atlas) are widely used in most AAA pipelines, so I thought it would be good for my portfolio to briefly showcase how I make and use trim sheet materials.


I did not spend too much time on this, because I knew what I was going for. Using mostly Google, Pinterest and some other image searches, I collected some references and added them to PureRef. Additionally, I skimmed through a national geographic video about ancient mosaics. https://www.youtube.com/watch?v=uGrwxSztKQM

I like watching video references to try and understand the physical properties of the surface because pictures don’t always convey some vital information like how light reacts with the material etc.


Pre-Designer Planning and Setup

For a trim sheet, it is important to set the technical aspects right. Texel density, the scale of each strip, pattern types, variations, details resolution and overall distribution must be planned well in prior and then deal with minor issues that may arise on the go.

Keeping the above-mentioned things in mind, I first split my trim sheet into 8 sections of different pattern sizes. In photoshop, I arranged some patterns in those sections, knowing how I can tile them in Substance Designer. You can think of it as a weird ‘concept guide’ for this project. This image was also used as a background reference in Designer.


Overall mindset and Approach in Substance Designer

Now it is time for Substance Designer. Before I jump in, I tend to have a clear idea of the approach, methods and tricks I would want to use to achieve my desired result. I strongly believe in making highly practical and usable materials. After understanding the actual requirement, I tend to keep things simple and easy.

Making the artwork quickly and efficiently using the best methods is as important as making it look amazing; because practically, this is how things happen in an actual game development situation. No one cares how you made something or how complex your graph is, but it must be made within a set time frame while following all pipeline rules and at the same time, it must look great and be usable as intended. Keeping these in mind, this is how I planned my Designer workflow:

• I don’t need things to be 100% procedural, but still I can expose some parameters for making easy variations if needed. So, I can use SVGs for making initial shapes and then tile it horizontally using tile sampler or tile generator.

• If I use SVGs, I can follow Vincent Derozier’s tricks on making mosaic tiles. This way, I don’t need to worry about generating the patterns, but can draw them quickly as I wish.

• I can maintain a specific set of colors, so I can use ‘color to mask’ node to make groups and for easy selections.

• Although I am tiling things, I can easily break the repetitions using slope blurs and different variations of noises. I can also layer in some overall details in the end to break repetitions.

• I can make color, roughness, metal from the SVG color IDs themselves and play with flood fills and histogram nodes for layering in more interesting details.

Substance Designer workflow

Now let’s get into designer, for real this time. Firstly, I added an SVG node and imported my ‘concept image’ as background. Then I followed a few different tricks explained below.
SVG drawing patterns: The block-drawing patterns were easy to make, I used the square tool and drew a few squares tracing the flow and shapes of the reference image behind.

Triangular shapes are made by editing the points of squares. All other shapes are made using the pen tool and by editing the points, where needed. I only drew enough ‘chunks’ and stopped when I knew I can tile them from then on.


SVG Background Curved shapes:

For complex curved shapes, I used an external node called ‘Curve Sampler’ made by Ilya Kuzmichev (https://www.artstation.com/artist/ikuzmichev).

This is an insanely cool node and makes things very easy. Basically, I had to make a square shape and then drive it through a curve, which you can edit by moving the points. I then coloured each curve sampler to maintain the set colors. This is plugged into the ‘background’ input of SVG node and then the surrounding shapes are drawn as usual by hand.



After making the ‘tilable chunks’ I tiled them horizontally using mostly tile generator and sometimes tile sampler. While the ‘y’ should always be 1, there are no magic numbers here but keeping ‘x amount’ and ‘x size’ the same or slightly different values, will give nice tiling result. For example:


Tiling of all strips:


Height Generation:

To make the height map, I first converted the color image to grayscale. Plugging this into normal, AO and height already gave a good base to start. By running a histogram scan and bevel node, the gaps in between each mosaic piece are reduced. Then for the details and breaking the repetitions:

1) I ran 3 slope blurs with different noise variations
2) Broke some patterns by slope blurring Perlin noise by itself, running it through mosaic grayscale, multiplying with clouds 1 and finally subtracting it from main height.
3) Overlay blended a fractal sum base with high roughness over the main height, to give subtle micro details
Normal and AO are then generated from the same using basic normal node and HBAO node.


I also added an underneath dirt layer which I made mixing BnW spots 1 and 2.

Using height blend I blended the mosaics and dirt – this way I can control how much dirt can be seen. The mask output comes in very handy while coloring as well.

Base Color:

For the color, the trick was simple. I made three major color gradients driven by heavily manipulated noises. These three colors were then blended all together using masks created mainly using two methods.

1) Directly using ‘color to mask’ node to easily select the part I needed as a mask. Then added or subtracted areas of the mask which needed combining or removing.
2) Using the initial grayscale directly or running it through histogram select to isolate the required areas.


These masks isolated the individual parts effectively, so blending different parts using copy and the respective masks did the job for basic layer. In addition to this, I added a detail layer and for this, I used a mask made from flood fill and random grayscale.

This mask did a lot of heavy lifting for the details color pass and for the roughness. Basically, I reused this mask with several histogram selects to make multiple variations of masks and used these as basis to combine color variations.


In addition to these, I added gold color to the gold parts, which I masked out using color to mask node. The underneath dirt layer is coloured with light brown and masked directly using height blend’s mask.

Roughness and Metal:

I started with metal first, in fact, I did this already while working on color. Very simple – I used color to mask node to isolate metallic areas, combined them all together using max lighten blend and directly plugged it into Metal output.

For roughness, I used the previously created ‘flood fill to grayscale’ mask (showed above) and used it as a starting point. After playing with levels, I layered in the metal parts and reduced the roughness a little to make it shinier.

Then I added in some slight grunge to give some surface variation. I used AO to slightly increase the roughness in the gaps. After all this, I added a levels node to control the overall roughness for decent output.


With this, the trim material is done.

The outputs are exported and importantly, converted to 8-bit so that we can use them in Unreal Engine. Final Render in Substance:


Additional Material:

I made one more very quick material by duplicating the current graph and removing literally 70% of it and adding a tile generator for shape. As soon as I added the new shape, most things kind of worked on their own. I barely tweaked the height and roughness, but I did rework on color. This is how it looks:


Making modular assets in Maya

I wanted to just make a small showcase where I can show the usability of the trim material. So, keeping things simple and minimal, I decided to make one wall, one floor and one column. The initial plan was simple:

1) Make flat strips and unwrap them as per the trims. For the column, make a cylinder.
2) Arrange the strips as per the module’s shape – use the power of snaps!
3) Combine everything in each module and export

There are a lot of video tutorials on Youtube on how to unwrap for trim sheets. A particular one I find it very informative is this: https://www.youtube.com/watch?v=VEHsZniXguY
Although Tim uses 3DsMax, he explains the principles very well. Do go through all his trim sheet content, there is a lot of information hidden in those videos. Moving on, I ended up making 2 walls so I can use one for tops.

Everything is very lowpoly (example – 28 tris for a wall 26 for floor), scale checked, pivots checked, material slots exposed, exported and ready for unreal.


Unreal Initial Setup

The first thing I do in Unreal for almost any project is to migrate one of my pre-built showcase maps, depending on what type of project it is. For this one, I use ‘material render room’ map and this has 4 directional lights, a PPV, some sample objects and a camera.


After tweaking some settings as per needs, I set a level blueprint which when I click play, will take the camera’s view, add a green screen for background, sets screen resolution to 200% and then takes a screenshot in 4k resolution.

I use green screen so I can easily remove it and have only the render as PNG, black screen can be a little difficult to select and remove. Final renders of the materials using Unreal + adding custom background in Photoshop:


Unreal Usage Sample Scene

I took the 4 exported modular assets into unreal, applied the two materials, tested them in ‘render room’ map and then proceeded to making a new level to build a small sample scene.

As for the scene, again to keep things as simple as possible, I placed one instance of the modules and duplicated them with snapping on – to make a simple room. Then I added in the pillars and torch asset from one of my old scenes. I scaled a pillar and added them on the corners to make them a bit interesting.


For the lighting, I removed 2 walls to make it look like a door and the light is coming in from outside. The shadows were too hard and the easiest way to make them soft is to use RTX and increase the source angle in directional light.

Since I was already using RTX, turning on RTXGI gave some subtle light bounces. In addition to this, based on the view of render camera, I added a few rectangle lights to give some fake lighting. I would avoid doing these hacks for actual production, but for now its fine.


Final Renders

For taking the final renders, I use a level blueprint setup that on clicking play, activated two cameras placed in the level and takes 2 screenshots in 4k Resolution. I then take the screenshots to photoshop and add the logos.



To conclude, I must say this little project was fun to do and I did learn a few new things during the process. There is still room for improvement in both production process and in presentation. To be honest, some of the issues I faced while working, were fixed using some ‘cheap tricks’ or ‘short-cuts’.

This is usually okay, but personally I felt like I ‘pulled it off’ instead of ‘nailing it’ when it came to fixing minor issues. I wish to apply everything I learned now and address issues more effectively in future projects.

Thanks a lot for reading. I sincerely hope some of this was helpful for you, if it was, I am super happy. I know I have not explained everything in detail. If anyone has any questions, do not hesitate to reach out to me on Artstation. You can also check out my other projects there.