Shyamsagar S talked about the workflow behind the Peacock Room, shared the custom vertex paint shader, and explained how modular assets and procedural materials were made.
I am Shyamsagar S, an Assets Department Team Lead at Technicolor Games, India. I have been in the industry since 2011 when I left my job as a software engineer to work as a full-time 3D artist. My long-standing interest in the art and entertainment industry led to this transition, which, of course, involved a lot of self-learning using available online resources as well as help from some of my friends and colleagues.
I began my career in this field as an intern 3D artist at Xentrix Studios, India, where I worked on games, TV series, and CG movies. Since then, there was no turning back, and I have worked on modeling, texture creation, and look development for multiple assets, both for production and games.
Moving forward, game art became the core part of my work resonating with my love for story-telling through props, environment, and character art design. Yet, I am constantly evolving as a 3D artist by studying new pipelines and workflows on the technical end, while fostering my own sense of art, be it realistic, contemporary, or stylized.
For the past few years, I have been involved in making multiple textures and materials for some popular AAA games. For this, Substance 3D Designer came into play to make procedural materials. I was quite skeptical in the beginning as I felt it lacked artistic freedom, but later I understood the true power of procedural material creation with Substance 3D Designer and how fast we can create beautiful materials, supporting textures, and masks with quick iterations.
I started getting deeper into material creation, and the idea of starting a personal project that is more material-driven came into mind. While I was searching for a reference, my girlfriend suggested the intricately designed Peacock Room of Castello di Sammezzano in Italy. I really liked the idea: it looked perfect, colorful, and challenging.
Since I was not going for the exact replica of the peacock room, I had a lot of artistic freedom to explore different possibilities for a concept, and that is something I always love to have when creating any artwork.
In this article, I am going to walk you through a material-driven approach to creating the real-time environment for my personal project The Peacock Room.
Planning a project is quite important. It helps us to be accountable for what we do and to achieve our goals. With a full-time job at a studio, the time I spend on personal work or studies is either after work or on weekends. Exhausting ourselves is not healthy too. It should be a fun learning experience. Here, we require time management and a proper plan for the 1-2 hours per day we can devote to the project.
Below, you can see the overall plan of the project and what needs to be done first, while also keeping daily track of the progress, further updates, and additions as you progress. For this project, it took me approximately 8 months of on and off designing, learning, iterating, and executing. Also, we must be persistent!
The key to any good art is observing what’s around us as most of the good ideas and decisions come from it. This makes collecting references a really important part of the process, the more the better. We should also make sure to filter, organize, and be precise in our requirements. Eventually, all this will also help us in building a mental library for future designs.
Here are some of the references I collected. I usually categorize them into primary and secondary.
I started with a basic blockout in Maya to understand how the elements can be made into modular pieces, to determine the modularity, design, overall scale, etc.
Then, it moved into a detailed blockout, here you can see that I also started planning the materials through rough color coding. This helps to find what can be done as a tile, trim or unique texture.
At this stage, I started exporting the models to Unreal Engine and testing them out with basic lighting.
Materials and Texture Maps
Since this environment is mostly planned for tile and trim textures, texture maps and material planning starting from the initial stages is crucial. A simple blockout of how the tile or trim texture maps would turn out, what resolution to go with, the number of materials, and finalizing the texel ratio are a few things to begin with. This will give you the initial idea.
Sketching Out New Ideas
At this stage, I also tried some quick over-draw sketches to flush out the final concept that I was aiming for.
Since the entire scene has many materials, I will go through a few here. You can find the breakdown of all the materials here.
As I mentioned before, reference is the key. Gather and collect as many references as possible, and get inspiration from any art resources at your disposal. I start my material creation by thinking of large and small shapes, sculpting out the volume, and adding roughness/specular/metallic to get the basic material properties. Then I move into adding the pigments (color/albedo) and giving it the final polish, which includes macro and micro details. Always make sure not to introduce noticeable or obvious repeating patterns when you deal with tile and trim materials.
The Ornament Arc Material
The idea here was to get enough variations and details once mapped to the model so the ornamental designs look unique. Check out the material here.
Here, I start with the shapes for the height map mostly using the shape nodes, mirror, bevel, edge detect, etc. For complex shapes, I went for the SVG node.
All the shapes are then combined. The histogram range node is added to get the proper range of the height map. I mostly go for the default base value of 0.5. Pushing the white value above or below 0.5 will give different heights for the shapes than required.
Now, we can add some wear and tear and scratches overlays to bring in more realism. Be subtle with this kind of macro and micro details. Think of what exactly you want to achieve. Dig deep into reference and question yourself. Is it used? Old and damaged? Is it cleaned and maintained often? Here, I look for subtle details: not too old and damaged nor too clean. For this, mostly slope blur, scratch generators, and some noise nodes are used. Also, I add some overlays at the end through the normal map to get a grainy limestone effect.
For the base, albedo is not that complex. It’s all about finding the right gradients and base masks and then layering one over the other. Here, I used a few grunge maps. If you make the brush pattern property 1, for most grunge maps, you can make it like a brush alpha. Then using the EZ splatter node (available on Adobe Substance 3D Assets,) you can make a number of base masks to give the right color pigmentation. It’s then driven through gradient map nodes and layered one by one. The masks derived from the shapes we made for the height maps are adjusted and mostly used for the cut masks. At times, we might have to create specific masks to get an accurate output and for artistic taste.
The next step is to add extra color variations, edge wear, and dust overlay and do the final color correction for Unreal Engine. It is important to check the result in every stage in your render engine with a good lookdev light setup.
For any material, roughness/metallic or specular/diffuse is quite important to give the accurate property of the material. Always try to layer details logically to convey a better story. Also, check this in your render engine, chances are what you see in the Substance 3D Designer viewport or Iray will be quite different in other applications. Minor HSL and level tweaks can solve most of the problems.
For the final sanity check, I use the PBR Validate node. It’s always good to get it all green, but some yellow bits would be fine. Since I use a composite texture/packed -p (Red channel – Roughness, Green – Height, Blue – Metallic, Alpha – AO) in Unreal Engine, an RGBA Merge node is used to merge the maps into the RGBA channels. Also, it’s a good practice to set a proper export preset through the output nodes so it’s easy to export and check in external render engines.
Later in the project, I wanted a color variant. This is where we can admire the power of procedural workflow. It’s quite easy to add variations and make iterations. I also introduced a switch color node to feed in the new base color variant created.
Model and UV Mapping of the Arc
Here a model trim is cut out from a plane according to the material. It is then extruded and made into an arc. Once the arc model is finalized, the UVs are shifted to get more variations from the tileable material. A light map is also made on another UV set to assist light bake in Unreal Engine. It is a good practice to sew and unfold as much as possible for the light map UVs and also keep all UV islands within 0-1 UV space and in the same texel ratio. This will help you avoid light bake artifacts.
The mosaic is one of the major materials used in the Peacock Room. Many of the tricks used here I learned from the wonderful tutorial made by Vincent Dérozier. I was also lucky enough to work with him professionally. You can find the mosaic here.
Mosaic patterns are quite complex, so planning your designs is quite important here. To achieve a good result, the easiest way is to draw in a part of the mosaic tile pattern using the SVG node with a color ID. This can be run through a Tile Sampler node and tweaked to get a good tileable trim texture.
Further down, the process is similar to what I have mentioned in the Ornament Arc Material, but you should observe and replicate the mosaic material properties as per the reference that is followed. Here, you can see a breakdown of how the two mosaic trims I made are built up.
Model and UV Mapping of the Floor
The Banner with a Peacock Crest Material
Making this banner was another fun and complex task. Here, I was aiming for a vertical texture map. You can see the details here.
For the embroidery crest height, I used the Stitch node created by Andrei Zelenco. The node takes mask inputs and places patterns at equal distances along contours.
Below, you can see the input mask with simple shapes and SVG nodes. The final height is created after tweaking a few parameters till I was happy with the look of the thread flow.
The base fabric creation is quite straightforward using a weave generator and adjusting the weave parameters as per requirement. It is a great idea to find close-up reference images of fabrics to understand the weaves and micro details.
For the vertical map of 2048x4096, I created two graphs of 2K square, which share the same base properties to avoid seams. Here, you can see the breakdown of the top and bottom parts of the banner. The final map was exported at 1024x2048 for the engine.
The banner top
The banner bottom
Finally, both of them are merged using the Material Transform and Material Blend nodes. Later, I also create a mask so I can make a red color variant in Unreal Engine.
Model and UV Mapping for the Banner
Vertex Paint Shader
To add extra details to the trim and tile materials, like color variation, dirt, dust, and drip, I created a vertex paint (VP) shader in Unreal Engine. I wanted to do the vertex painting in Maya to add and mix the vertex colors as it has more control over selecting vertices, faces, etc. For that, I created a vertex paint shader using Stingray PBR in Maya. The parameters are similar to the Unreal VP shader.
80-90% of the vertex color pass is done in Maya and the final touch – in Unreal. This also helped in adding, moving, removing vertex, and adjusting UVs on the model as per our vertex paint requirements. I would advise planning the model from the beginning with the required vertex in the right places if you use a VP shader workflow, keeping in mind that the asset should also be optimized to work smoothly in game engines.
Vertex paint shader in Unreal Engine. You can see one of the bronze trim materials with its vertex paint properties
The vertex paint shader created in Maya with Stingray PBS
Here, you can see the vertex paint process from Maya to Unreal Engine
I created a few vertex paint masks in Substance 3D Designer. You can see an example of the masks used. Any kind of mask can be fed into the RGBA vertex paint channels of the shader to get the desired output.
Here are the modular parts used to build the Peacock Room:
The Statue Creation
For the project, I wanted to add a human presence. So the idea of designing a statue of a king came up. The complexity of human beings and animals has always fascinated me. I decided to build the statue from scratch as a study of character design and anatomy. Here's the result.
It started from a sketch after exploring many reference images and ancient statues. I wanted the statue to look godly.
I found the Human Proportions Calculator, which is quite helpful to get realistic proportions. I created some guides in Maya and ZBrush with measurements so I can keep checking and fixing it on the go. I also did a self-review by overdrawing in each stage when developing and posing the character: écorché, landmarks, gestures, negative space, weight, and balance.
The final ZBrush sculpt
There is nothing fancy in the sculpting process. I used ZSpheres, standard brushes, and ZModeler. Once the sculpt was done, I used a mix of decimation, retopo, and ZRemesher to get the desired low poly. After that, each part was named properly with a prefix for high/low poly and exported as FBX. Finally, I baked and textured them in Substance 3D Painter. Throughout the project, I used centimeters as the unit scale to avoid scaling issues while exporting the models from one software to another.
The game-ready digital sculpt
Texturing in Substance 3D Painter was quite fun and satisfying. I made three variants of the statue: bronze, marble, and wood. Here is the marble variant:
The designs were chosen to show the character of the king: that he is an enthusiast and an explorer. I also wanted it to look ancient and royal. Here is the result.
The process was quite straightforward. First, all props were planned in a way that a set of props can share the same texture page. This reduces the number of texture maps and memory usage in the engine. For example, here you can see one of the sets that share the same UV space and a texture map:
Each part is checked for model/UV cleanup, named properly with a prefix so I won’t get any artifacts while baking in Substance. Then it’s all about authoring the materials.
Here are all the set dressing props used in the scene:
The lighting passes were done throughout the process, refined and adjusted based on materials; I was trying to get the composition and mood of the level. When I was doing the lighting for this level, I tried to push it to a realistic look with bright and sharp sunlight and soft bounces. An HDRI dome, sunlight, some point lights, and spot lights were used to give the scene some extra key and bounce. A balance of a few yellow and blue colors in lights was used to give a daylight mood and atmosphere. I did not add too much real-time post-processing within the scene, mostly only tweaked the exposure.
Finally, the screenshots and the cinematic sequence were created using a cinematic camera in Unreal Engine. What’s great about the cinematic camera is that we can set the properties the same as a film camera. For better composition, it’s always good to use such rules as the rule of thirds, symmetry, golden ratio, etc. The camera guides within the Unreal Engine cinematic viewport help a lot to gain a better composition quite easily.
I made one camera to create some still shots and the other – for the sequence.
For still shots
For the sequence
The focal length and focus distance are keyed as required to get a good framing and DOF for the shots.
Toggling the Debug Focus Plane on and off helps to find and adjust the camera focus point.
All frames for the cinematics were exported as an image sequence from Unreal Engine and edited in DaVinci Resolve, BG music was added, and some color correction was done and exported.
It was quite a challenging project, which taught me a lot, helped me to improve my skillset, experiment, learn from my failures, and stay positive. This motto has helped me throughout my career. I learned that mastering any skill takes time and one must always revisit the fundamentals. For example, a master painting, sculpture, architecture, a complex material in Substance 3D Designer, a hyper-detailed sculpt in ZBrush might all seem intimidating for a beginner or even an experienced artist. But if you study it carefully, you will realize that it was gradually built from small and simple shapes, systematic workflows, and procedures.
It is a good idea to split your projects into parts and focus on specific tasks. Hope this overall process overview is helpful to everyone. I want to say a huge thanks to wonderful artists Daniel Thiger, Vincent Dérozier, Pauline B, Ognyan Z, Scott Eaton, Dorian Iten, Pablo Muñoz Gómez, Raf Grassetti Sandis Kondrats, Uldis Zarins, and many others for sharing their knowledge and helping other artists like me with precious learning resources and guidance. That’s all about the Peacock Room for now, take care, be safe and keep creating art!
You can find my art on ArtStation, Instagram, and Twitter.
Shyamsagar S, Assets Department Team Leader
You may find these articles interesting