logo80lv
Articlesclick_arrow
Research
Talentsclick_arrow
Events
Workshops
Aboutclick_arrow
profile_loginLogIn

How to Develop a Procedural Embroidery Tool in Substance 3D

3D Character Artist Roxana Moshashai has shared a comprehensive guide explaining how she created a procedural embroidery tool in Substance 3D Painter and Designer.

Intro

Hi! I'm Roxana Moshashai, a 3D Character Artist from Germany with an interest in tech art and proceduralism and a passion for fashion and historic garments. I recently set out to combine all of these interests into one project, which is why, for the last few months, I have been working on a procedural embroidery tool. This project also formed the basis of my Master's Thesis in Game Technology at Breda University of Applied Sciences.

The Goal: Power and Simplicity in Substance 3D Painter

As a Character Artist, I always wanted a better solution for creating intricate embroidery directly inside Substance 3D Painter. Hopping back and forth to Designer can disrupt the creative flow, and I wanted a tool that would feel like a natural part of the Painter workflow. 

The challenge was to create something that was both powerful and simple. I wanted it to handle a variety of techniques – from cross-stitching to beadwork – and give artists an intuitive way to control the crucial direction of the threads. The central conflict was packing all these features into a tool that remained easy to use for everyone. To achieve this, I decided to build it iteratively, using feedback from students and professional artists at each stage to guide its evolution.

Part 1: The First Iterations & The "Complexity Trap"

My first approach, Iteration 1, was a Substance material. The core idea was to generate the embroidery using a combination of inputs and parameters.

Technical Breakdown: The Tile Sampler and the Height Mismatch

The core logic of the first version was built on two separate Tile Sampler nodes: one for the height/normal data and one for the color. The idea was to have them share the same parameters so they would match.

However, this created a significant visual problem. Because the nodes were separate, their internal random seeds could cause the height and color information to not align perfectly. This led to subtle but noticeable visual artifacts where the color didn't quite match the thread's shape.

Height channel/Color channel/Material view (showing the color/height mismatch):

To solve this mismatch for Iteration 2, I switched to the Shape Splatter node. Paired with the Shape Splatter Blend Color node, I could process both height and color data together, ensuring a perfect 1:1 match and completely eliminating the alignment issue.

With that fixed, I focused on adding features based on user requests, like new stitch types and a "Border" mode.

Painting the Flow Map

From the beginning, a primary goal was to give artists control over stitch direction. The solution was to leverage a built-in feature of Substance 3D Painter: painting a Flow Map inside the normal channel.

The workflow is as follows: The artist uses a special brush with the "Follow Path" option enabled. This brush has a specific color value (RGB 128, 255, 128) loaded into its Normal channel slot. As the artist paints a stroke, Painter automatically encodes the direction of that stroke into the Normal channel's Red and Green color values. My Substance 3D Designer graph was then able to read this directional information and use it to orient each individual stitch or bead correctly. It’s a powerful technique that uses a standard workflow to achieve a custom result.

The embroidery pre-flow-painting:

The flow painting result viewed in the Normal channel:

The embroidery post-flow-painting, with the correct thread and sequin direction:

Creating the Border Mode

To generate embroidery along the outline of a shape, I used a specific node chain. The user's input mask was fed into a Mask to Paths node, which was then connected to a Paths to Spline node. This created a clean vector spline that I could then use with a Scatter on Spline node to accurately distribute the stitches along the mask's edge.

But even with these improvements, a bigger problem became clear. The tool was now more powerful, but the core workflow was still a complex material that required a deep understanding of Painter's anchor points. The feedback was clear: I had made the tool less usable.

Part 2: The Breakthrough - Rethinking the Workflow

The solution wasn't another feature; it was fundamentally changing the tool's architecture. The big change was converting the tool from a Material to a Filter. This eliminated the need for complex anchor points and made the workflow incredibly simple: just drag and drop onto a layer. This single change was the key to making the tool truly artist-friendly.

The Performance Workaround

The other major piece of feedback was performance lag. Instead of trying to solve the impossible task of updating thousands of beads in real-time, I created a clever workaround: a separate, lightweight Flow Vis filter. Artists use this fast filter to paint their stitch directions with a smooth, real-time preview. Then, they simply toggle it off, and the main filter below reads the flow data to render the final, high-quality result.

The Flow Visualisation filter in action:

The embroidery result with the correct thread and sequin direction:

Technical Deep Dive: Final Refinements

Several other technical solutions were implemented in this final version to improve both usability and maintainability.

  • Modular Design and the Multi-Switch: To further simplify the user experience, I split the single, complex tool into two separate, focused filters: Fill Embroider and Border Embroider. This created a new challenge: how could both tools access the same library of embroidery patterns without me having to duplicate the graphs? The solution was to create a third Substance 3D Designer graph that contained only the base patterns (Thread, Sequin, etc.). Both the Fill and Border filters then referenced this central pattern graph. To allow the user to choose a pattern, I used a Multi Switch node in the main filters, which was controlled by a simple dropdown list in the UI. This modular approach was incredibly efficient; I could update or add a new pattern in just one graph, and it would automatically appear in both tools.

The Embroidery Input graph, which is referenced by both the Fill Embroidery Graph and the Border Embroidery Graph. The multi-switch setup is visible on the right:

  • Solving Transparency: A key quirk in Substance 3D Designer is that greyscale outputs don't carry an alpha channel. To get perfect transparency on the embroidery, the node connected to the material's Opacity output had to be in color mode. I simply added a Gradient Map and a Greyscale Conversion node at the end of the chain to convert my greyscale alpha map into a format that Painter could correctly interpret, ensuring clean edges without a background.
  • Creating a Global Scale: To make resizing the pattern more intuitive, I exposed a single custom parameter called scale_global. Then, inside the Function Graph for the X Amount and Y Amount parameters, I mathematically linked both of them to this one slider. This allowed artists to change the overall size with one control instead of juggling two.

Showcase & The Proof in the Data

The result of this journey was a tool that was powerful, flexible, and finally, fun to use.

The success was clearly reflected in the data I gathered from testers. The shift to a filter-based workflow had a massive impact on usability.

As the graph shows, the average "Ease of Understanding" score from artists jumped from 3.30 in the second iteration to 4.40 in the final version, while "Enjoyability" rose from 4.10 to 4.60.

Conclusion: My Key Takeaways for Tool Developers

This project taught me so much, and I hope these key takeaways can help other tool creators out there:

  • Offer Presets for a Strong First Impression: They are a critical onboarding tool that reduces setup time and provides an immediate "wow-factor" that encourages experimentation.
  • Embrace Video Tutorials: For any tool with a non-standard workflow, a video is essential for helping users overcome the initial learning curve.
  • Design a Progressive UI: Avoid overwhelming users. Keep advanced settings in a foldable "Advanced" section to make your tool approachable for new users while retaining deep control for experts.
  • Build Visual Helpers & Workarounds: The Flow Vis filter made the tool's logic more transparent while also serving as a practical performance workaround. Smart helpers can be a great way to solve deep technical challenges.

Thank you for reading! I hope sharing this process has been insightful. You can see more high-resolution images and videos of this project on my ArtStation.

For those interested in the user-testing data and the academic framework, please feel free to reach out to me directly. I’d be happy to share the full thesis.

Roxana Moshashai, Character 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