See How to Texture an Iconic Kolkata Yellow Taxi

Snehadeep Pal told us the story behind the Kolkata Yellow Taxi project and detailed the texturing pipeline performed in Substance 3D and Mari.


Hello there! My name is Snehadeep Pal. I'm from Kolkata, widely known as "The City of Joy" in India. It's a well-known city, famous for its rich culture, festivals, people, Durga Puja, the largest library in India, and the "Howrah Bridge," the world's longest cantilever bridge, among numerous other attractions.

Back in my childhood, we had an old television with only four channels, one of which played cartoons. My first cartoon show was Classic Ben Ten, my first animation show was CARS, and my first PC game was Grand Theft Auto: Vice City, which I played. I've always wondered how they were made, and it inspired me to pursue a profession in 3D. So, I enrolled in a three-year degree called "B.SC. in Animation and Filmmaking" to learn and begin my 3D career.

During my course, I was exposed to 3D and learned about the fundamentals, how everything works, and which software is utilized in this fantastic job. At the end of my course, I had the opportunity to work as an intern at Square Zero Games, a small gaming studio in Kolkata. I completed my internship there and worked full-time for roughly 9 months. Throughout this period, I attended a few 3D seminars and events, and I am still searching for my true calling.

During this time, I fell in love with texturing work and left to follow my dream of becoming a Texture Artist. I have met many people along the way who gave guidance and mentorship to achieve my current skillset.

Kolkata Yellow Taxi

I began the Kolkata Yellow Taxi project because I wanted to do something that would help me reconnect with my birthplace. The yellow taxi is an essential part of Kolkata and has been branded the "King of the Roads." It is also very close to my heart and an icon of Kolkata, among other things, so this is the ideal project for me to work on because it not only showcases my skills but also introduces everyone to my hometown.

Arka Nag Chowdhury was a classmate of mine when we first met. Arka, myself, and a number of other classmates were and remain close friends throughout college, and we have connections like brothers, which is why I chose to utilize his model.


Before I begin any project, I like to gather enough references to understand how to approach the model, create a roadmap, and then create a story for the model that connects with the audience. To serve as a foundation for my work, I thought of a taxi that travels on the road for quite a long time, goes through repairs, and especially changes its tire, and again, it's very scratched up and runs a while, and the taxi is still useable for years but also goes through a lot.

The yellow paint covers most of the model. To set up the main yellow paint on the model, I need to make a mask to define the areas of the model that have yellow paint on them. I started with a flat yellow paint layer and added all the paint variation by observing the references using Grunge Maps, different types of dirt, dust masks, and Baked Maps like ambient occlusion, curvature, and other masks made from Baked Maps. I did make a Roughness Map for the yellow paint, but the most important map for me is to create the Albedo Map. I used the Albedo Map to set up the final paint layer in the render engine, defining all the parameters like specular, clearcoat, and roughness value there, and iso mask to also define the yellow part in the render engine.

My basic workflow starts with Substance 3D, then onto Mari. To start the project, the first thing is to analyze the model and make the Bake Maps, specifically for ambient occlusion and curvature. Then, I create all the masks that help create the final Iso Maps and texture in Mari. After creating all the maps, I export them into Mari and start making the final iso masks by combining, subtracting, or painting over them according to my reference. The iso masks greatly help to make it easy to create the final paint layers.

The challenge I faced during this project was to separate the rust layer from the paint layer and metal part because the rust defines the age of the car, and I couldn't put it everywhere. I had to be very specific about the rust and make it a perfect balance to define the age of the car and its workability.

The Workflow Behind Adding Wear, Dirt & Scratches

After I've finished the main color or texture layer, I add wear, dirt, and scratches on top of it. This method helps generate a sense of reality, similar to the real world, where everything has its own thickness. As a result, I made a few masks in Substance 3D Painter using the procedural method. I used mask generators, smart masks, and other Tileable Maps. Then, I created the final iso mask in Mari. This way, I'll have the final mask to apply wear, dirt, and scratches in Mari. I can also use it to adjust parameters in the render engine, and if necessary, I can export the masks created in Substance 3D Painter separately to help me build my shader.

For the tires, the process is similar to what was done previously. However, for the tire pattern, I used Substance 3D Designer to make a basic tire pattern. From there, in Mari, I added tire text and imperfections to make it look as though it had been running on the road for quite a while.

Adding Writings & Stickers

The writing and stickers were created in Photoshop using real-life references. I extracted the parts I needed from the reference, manipulated them, adjusted them according to my preference, created a black-and-white mask for all the text and writings, combined them into a single image, and imported them into Mari to project them on top of the model. Using this Alpha Map texture, I created all the number plates, texts, and signs in the car.

In my texturing process, I usually work on one map at a time and try to make as much of the thing as procedural as I can, so if I have to change something, I can change it very easily. At first, I mostly focused on the Color Map or Albedo Map because it's a really important Map, and tried to make it as good as I could. In the process of creating the Color Map, I also created all the necessary maps and masks, so now it's really easy to create all the Supporting Maps like Roughness, Bump, Displacement, and Metalness Maps using those masks and maps with a little bit of tweaking. This is my process to create all the texture maps for my model.

Setting Up the Final Model & Rendering 

For the render setup, I did it before starting the texture process. I set up the scene with a basic backdrop and a studio light. The reason for setting up an early render is to check how the texture is looking in the render engine. It's really hard to complete the whole texturing process first and then start the lookdev process. So, I like to do a test render along with the texturing process to check how my texture is looking and if any changes need to be made. It helps me to do this easily without any complications.

I chose RenderMan for this project to test out all the beautiful-looking shaders and the controllable parameters within the shader. I thought it was the perfect render engine to use for this project. Also, RenderMan has a great denoise capability that tremendously helps reduce my render time. I render it in low samples and then use the RenderMan denoiser to achieve the final image.

For the lighting setup, I used a studio light for my turntable render and a basic three-point lighting setup for some final and close-up shots. I also used the "Rule of Thirds" composition method to frame my shots for the render.

For the post-production settings, I usually don't do much in this process. I basically add some brightness contrast, sharpening, color noise removal, a little bit of vignette effect, and finish it off with lens correction to get some chromatic aberration effect.


For me, texturing is the process of telling a story about something without saying any words. I think it's really important to have an inspiring story for the model that I'm working on because it's not just a benchmark for the model; it's also a direction and a sense of what it should look like. The next main important thing is to have really good reference images and a plane to execute the whole process from beginning to end, use those references to observe, and try to mimic the same feeling in the texture and add those little details to achieve the most appealing result.

The main way to create an appealing texture is to mimic the real world. In the real world, everything is imperfect in its own way. When we try to mimic the imperfections, we may do it perfectly, but that's the reason the work doesn't look right. So, the main challenge is to achieve real-world imperfection perfectly in our work. One piece of advice I got from one of my mentors is, "You don't have to use the brush everywhere in the model; sometimes it's okay to leave a spot untouched."

I don't have much to say to beginners because I also started my journey recently. However, as I already told you previously, it's important to create a story around your model, collect good references, make a good execution plan, and pay attention to small details to achieve the best possible result in your own project. Keep learning and keep growing.

Thank you.

Snehadeep Pal, 3D Modeling & Texturing Artist

Interview conducted by Theodore McKenzie

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