Although there exist tools to create a painterly look in other programs like Blender, I wanted to create a tool for Houdini users. I wanted to focus the toolkit to capture the loose, tactile brushwork found in traditional painting and animation like Spider-Man: Into the Spider-Verse.
To have a better idea on how artits achive this painterly look I looked at tutorials that showed how they paint by layers and through these layers they start adding things like shadows and highlights.
Following how artists think about lighting, layers, and simplifying geometry, I created 3 separate tools that come together to create this painterly effect.
I started the painterly tool by looking at how real artists paint—specifically how they layer highlights, core shadows, and bounce lights to build up an image. When people are learning to paint lighting, they almost always start with simple shapes, usually fruit. I decided to follow that same traditional logic, so I found a fruit mesh online to use as my guinea pig for testing.
Since I had just built the monochromatic dot tool, I already knew that getting a good stylized look was going to take a ton of layers to separate the lighting zones. To handle this, I built a section early in the network that generates custom masks based on the lighting. I made sure these masks were fully editable so the user can easily tweak them and control exactly where they want something like a highlight or a shadow to sit.
Once the masks were working and fully adjustable, the next step was figuring out how to connect them to a scattering node. Instead of just scattering points randomly, I used the lighting masks to drive the point density. This way, areas that needed heavy shadows or bright highlights got a specific, controlled layout of points, keeping the core lighting structure intact before any brush strokes were even drawn.
At first, I tried running this whole painterly system inside COPs, just like I did for the dot toolkit. But I quickly ran into a massive wall: COPs took way too long to analyze and process everything. The early tests looked cool, but the cooking times were a nightmare. I didn't want to sacrifice viewport speed and lose control over the look, so I shifted gears. I kept the main scattering and geometry work inside SOPs to skip that massive computation slowdown, keeping the tool fast and interactive.
With the points scattered based on the lighting, I needed a way to give users a ton of control over the actual shape and look of the brush strokes. I started researching ComfyUI to see if I could bridge it into my Houdini network. At first, I thought about using it for shape or flow analysis, but I realized it was way more useful for generating the stroke textures themselves. It basically gives the user endless possibilities for different stroke styles.
While testing the strokes, I noticed another problem: for the brush strokes to actually look good and stick properly without losing their shape, the 3D geometry itself needed to be stylized before any points were scattered. If a model has too much tiny detail or is perfectly smooth and digital, it completely ruins the hand-painted feel.
To fix this, I built a separate geometry pre-processing section into the tool with three options for the user:
Simplify Mesh: This cleans up heavy geometry and strips away unnecessary details that would clutter or ruin the paint strokes.
Stylize Mesh: This procedurally deforms the silhouette of the model to give it a more hand-carved, organic shape.
Sharpen Edges: This gets rid of that overly smooth "3D look" by sharpening the geometric transitions. It creates distinct, hard planes that mimic the chiseled block-in phase of a real painting.
To wrap up the toolkit, I wanted to make sure the user had total control over the final look of the paint. I set up the internal network so that you can use it to completely edit the final texture properties.
It outputs custom maps for Normals (bump), Roughness, Opacity, and Base Color. By exposing these specific channels, artists can control exactly how light hits the physical ridges of the paint strokes, giving the final asset a really rich, tactile, hand-painted feel.
Geometry Before Painterly Tool
Brush Strokes
Geometry and Brush Strokes Before Render
Moving forward, I need to focus on improving the performance, especially with animated or simulated geometry. A key enhancement will be adding a way to cache the scattered points, which will significantly cut down on processing time in COPs.
I also need to work on the ComfyUI setup. It's essential to implement a way to save the preferred brush stroke locally, so the results are preserved when the file is reloaded, and not just regenerated each time.
Finally, I plan on testing the brush stroke applicator on more moving and simulated assets to really push what this tool can do procedurally. I also need to spend some more time fixing small issues in the stroke shape section of the tool.