Creating Realistic Textures on an Old Woven Basket Decorated with Seashells
Shubham Vijay talks about the meticulous process of recreating an intricate pattern on a woven basket in 3D, breaks down the process of texturing several different surfaces, like rope and seashells, and explains how he integrated 3D scans of real-life objects into the project.
Introduction
Hi, my name is Shubham Vijay, and I'm a 3D Environment and Prop Artist based in Jaipur, India. I'm currently working as a mid-level 3D Environment Artist at Lakshya Digital, with four years of professional experience in the industry. Over the years, I've had the opportunity to contribute to several unannounced gaming projects.
My journey into game art wasn't traditional. I originally started out pursuing a degree in Computer Science, but midway through, I realized my real passion was in video games. Curious about how games are created and what goes on behind the scenes, I decided to learn game art alongside my engineering degree.
Outside of work, I'm an avid gamer and love to sing and play guitar in my free time.
Getting Started with Wicker Basket
The main reason I started this project was to push myself. I wanted to see if I could handle a prop with this much detail without making it look messy. Balancing different textures, from the rough basket to the smooth shells and worn ropes, forced me to be much more disciplined with my texturing and overall project setup.
To make this asset look real, I gathered a bunch of references of traditional tribal baskets, aged wood, and natural props.
Before jumping into modeling, I spent time studying how actual basket weaving works by looking at how horizontal, vertical, and diagonal strands interlock under tension so I could build an accurate weave structure instead of guessing.
I also used close-up photos of old wood, ropes, and shells to guide my sculpting and texturing, making sure details like cracks, dust, and color variations felt grounded. Lastly, looking at real prop setups helped me place all the hanging pieces naturally and get a believable, balanced silhouette.
Modeling
I started the modeling process by creating a clean blockout using basic shapes to establish the overall proportion, scale, and silhouette of the asset. To ensure the basket felt grounded and true to real-world scale, I imported a standard human model from the Maya Content Browser to compare proportions directly against realistic human body dimensions.
For this asset, I attached several hanging props, such as large beads, shells, and bottles, to make the silhouette look busier and more detailed. This adds extra visual interest and enhances the story of the asset.
For modelling the small ropes, I used Blender's Curve Tools. Blender's Curve Tools make it super easy to create smooth, flowing shapes like ropes and strands. It lets you quickly bend and adjust your geometry without having to tweak every single vertex by hand.
Here's a quick example for better understanding:
First, I imported the mesh into Blender and added curves wherever needed. Then, I increased the depth setting. Once I was happy with the shape, I converted the curve into a mesh by going to Object > Convert > Mesh.
Then imported the rope mesh into Maya.
To model this complex wicker pattern without overcomplicating things, I broke the structure down into smaller, manageable parts. I studied the flow of each strand to understand how they interact with one another.
To save time, I built just one small tileable section of the pattern. Once that small piece looked right, I copied and duplicated it across the mesh.
First, I modeled the vertical and horizontal strands separately and layered them on top of each other.
Then, I added cuts wherever they intersected, carefully adjusting where each strand should weave underneath or cross over the next.
Then, I did the exact same thing with the diagonal strands. I modeled them separately first, placed them over each other, added the necessary cuts, and manually adjusted which parts went underneath and which stayed on top.
After that, I combined these vertical, horizontal, and diagonal strands to create a perfect tileable module.
I manually adjusted the strands to fix minor intersections. Then I duplicated and tiled this section to form a flat square panel.
Using the Lattice deformer, I easily shaped the flat mesh into the desired curved basket form and finally extruded all the strands to give them solid 3D thickness and depth.
Eventually, I manually adjusted the strands to break up the repetitive, monotonous look.
High Poly:
Once I was happy with the blockout and confirmed that the silhouette had the right density and balance, I moved on to the high-poly stage using a mix of Maya and ZBrush.
In ZBrush, I focused on subtle surface details rather than heavy sculpting, since I planned to push the finer micro-details in Substance 3D Painter. This kept the workflow efficient and saved a lot of time.
Low Poly:
For this asset, I kept the poly count pretty high, as my main goal was the final output and presentation.
I used a mid-poly mesh to create the low poly by adding the required edges on the curved surfaces. This helped me avoid faceting. For some hanging objects, I also did retopology in Maya.
UV Unwrapping & Baking
I unwrapped the entire asset in Maya and packed it across 6 UV sets at a 4K resolution to maintain crisp texture quality across all the complex details. To maximize texel density and save texture space, I heavily reused duplicate geometry.
Elements like the hanging shells, hanging bottles, bottom weave strands, ropes, bindings, and the half-shells on the bead garland share the same UV space. I stacked their UVs to get as much resolution as possible out of the maps.
Once the UVs were finalized, I imported the high-poly and low-poly models into Marmoset Toolbag for baking, where I extracted the Normal, Ambient Occlusion, and curvature maps.
3D Scanning
I used 3D scanning because I wanted to add a new technique to my workflow. To create this bundle of sticks, I first tied a few broomsticks together with a small piece of string. I hung the bundle in the air instead of putting it on the ground so that every angle, including the bottom, would be clearly visible for scanning. Finally, I took photos from all sides in soft, even lighting to avoid heavy shadows that could mess up the 3D scan.
The main things to keep in mind when doing 3D scanning are how you capture the photos and the very basics of getting a good scan. You can use any scanning software of your liking. To learn the basics, you can check out this amazing breakdown on 3D scanning by Jeetendra Sharma.
After capturing the photos, I imported them into RealityScan. First, I aligned the images and built the high-poly 3D mesh. Then, I cropped out the extra background noise, like the hanging string and surrounding objects. Finally, I cleaned up the mesh, fixed small surface errors, and closed any open holes.
I imported the raw scan model from RealityScan into ZBrush to do some cleanup and fix small surface imperfections. Then, I decimated the mesh to lower the polygon count and imported it into Maya for retopology.
Then, I transferred the base texture from the raw scan mesh and baked the normal map from the cleanup mesh onto the low-poly mesh using Marmoset Toolbag.
Texturing
For the texturing process, I focused on adding layers of realistic wear and age to show the history of the prop. I used custom height and roughness maps to give the woven wicker a worn and rough look. I also added subtle dust and dirt in the deep cracks where the ropes and shells connect.
Color variation was very important, so I added slight sun fading to the outer surfaces of the basket and a soft, aged look to the shells so everything blends nicely.
For the top weave part, I had two options in mind: create it in Substance 3D Designer or in Substance 3D Painter. To make sure the textures matched and stayed consistent across all parts of the asset, I chose to do it in Substance 3D Painter.
I started by using a tileable woven height alpha to create the base height, main shape, and surface structure of the basket weave. I divided the pattern into two masks – one for horizontal strands and one for vertical strands – to create group masks for each direction. After that, I set up the base material.
To prevent a flat, repetitive appearance, I created two custom color variation maps in Photoshop – one specifically for the horizontal strips and another for the vertical strips. By selecting individual strands at random and assigning subtle, varying hues to them, I ensured a natural, hand-woven look.
I imported these custom color maps into Substance 3D Painter as a Fill Layer. By setting the layer blend mode to Color, I made sure that the randomized tones seamlessly blended into the underlying wood material, giving every individual woven strand distinct, realistic color variation without losing the natural wood grain details.
Here is what the final process looked like for different parts of the basket.
Upper Weave:
Wicker Pattern:
Rope:
Shells:
Bindings/Wraps:
Willow Rod:
When I started my 3D journey, I struggled with texturing and always wanted to achieve photorealistic quality in my renders, but I felt like something was missing. As I learned more about texturing, I realized there are a few core rules to keep in mind to consistently reach realistic results.
Knowing the story of the object – how old it is, its environment, how heavily it was used, and its material type (metal or non-metal) – is essential for directing these details.
If you are new to texturing, keeping the following basic points in mind will help you break away from a flat, digital look and achieve realistic results much faster:
1. Color Variation: Real objects rarely have a single flat color. Adding subtle hue changes, sun-fading, and slight color differences across surfaces breaks up the digital look and makes the material feel natural.
2. Roughness Variation: Roughness dictates how light bounces off a surface. Blending shiny and dull areas – like fingerprint smudges, worn edges, or greasy spots – gives the object a believable, real-world response to light.
3. Surface Height: Micro-details like bumps, cracks, or fabric weaves give depth to an otherwise flat mesh. Adding height detail brings realistic surface texture that catches shadows and highlights correctly.
4. Dirt & Grime: Dust and dirt naturally collect in deep crevices, tight corners, and areas that are hard to clean. Placing dark, muted grime in these recessed spots grounds the object and anchors its elements together.
5. Scratches: Scratches show how an object has interacted with its environment over time. Placing sharp, fine edge-wear on exposed corners and subtle scuffs on high-traffic areas tells the story of its usage.
6. Edge Wear & Chipping: Edges are the first areas to lose paint or wear down from contact. Adding realistic edge wear reveals the base material beneath and defines the shape of your 3D model under direct light.
7. Material Story & Context: Matching your textures to the object's age and environment ensures every detail makes sense. Weathering on an outdoor, abandoned prop should look entirely different from an item kept inside a clean room.
To create the detailed rope fibers, I used the FiberMesh tool in ZBrush. I generated fine strands directly over the main rope mesh, adjusted their length, thickness, and gravity to make them look natural, and then exported the fiber mesh to combine it with the final low-poly model.
During final rendering, the asset felt a bit empty to me. So, I added a few bottles inside the basket and attached a cloth to the rod to introduce a nice fabric element.
Rendering
I did the rendering in Marmoset Toolbag. I used a very simple light setup for this. First, I used a sky light as the main light source. Then I added a rim light and a fill light.
To highlight the right spots, I placed my main light at a top-front angle so the eye naturally goes straight to the front weave, the beads, and the big hanging shells. I added rim lights behind the asset to lift the silhouette off the dark background and catch the edges of the glass bottles and rope loops.
Then, I added soft fill light to bring out all the different materials – making the glass look shiny, the shells glossy, and the wood nice and matte. Finally, I added a few subtle floating embers and dust particles in the compositing part to give the whole render an aged, magical vibe.
I used alpha cards for spiderwebs and feathers.
I used a Subsurface Scattering (SSS) map on the hanging shells to capture their organic, semi-translucent quality. Real shells allow light to penetrate and scatter slightly beneath the surface, especially along thinner edges. Adding an SSS map helped break the hard, opaque plastic look, giving the shells a soft, realistic depth and natural warm glow under direct lighting.
These are the post-production settings I used:
After rendering, I brought the images into Photoshop to tweak the colors, contrast, and brightness. This final step made the textures pop and gave the prop a clean, finished look.
Conclusion
This project taught me a huge lesson about perfectionism and knowing when to finally call a piece done. I spent a lot of time tweaking every single detail, which had both a good side and a bad side. The good side was that it genuinely pushed the final quality to a level I'm really proud of. The bad side was that my desire to make everything perfect ended up eating a lot of extra time.
Eventually, I realized that as artists, we are almost never 100% satisfied with our own work, and that's actually a good thing. Leaving a little room for improvement keeps you hungry to do better on the next project. Knowing when to step back and declare a project finished isn't giving up – it's just closing one chapter so you can take everything you learned and move on to build something even better.
Getting feedback was crucial while working on this piece, as it gave me new angles on my artwork and helped when I felt stuck. It kept my workflow on track. The main challenge here was keeping a consistent look across all the different objects. I had to make sure every piece was well-balanced and complemented the overall asset.
If you are someone who is starting out in 3D, my advice is to focus on mastering the basic forms, the silhouette, and realistic texturing before jumping into heavy details. Always gather real-world reference photos, and study how objects wear down over time.
Start with smaller objects and aim to finish them within a pre-determined deadline. Setting a time limit helps you stay focused and finish projects faster. Once you feel confident, you can gradually move on to more complex props.
Also, pay close attention to rendering because lighting and presentation decide how your final output looks. Even a great model can look flat if rendering is poor, so take the time to set up clean lighting and camera angles to showcase your work effectively.
And the most important advice is: keep practicing! Thanks to 80 Level for featuring my work and allowing me to share my workflow with everyone. Also, thanks to Jeetendra Sharma and Ketan Kashyap for their valuable feedback and guidance throughout the project.