Lets Talk Color Pickers - Part 3

General / 16 December 2020

Well its been over 2 years (!) since I last posted about color pickers. If you didn't see it, I developed a node to provide a procedural way of producing color variation given a single color picker. Take a look here. I did give a talk on the specific inner workings of the node and Ubisoft was kind enough to let me release that video to the public. So if your interested in how that node was put together, watch it here.

Since then, I have gotten some great feedback and it has seen some extensive real world testing. Finally, I found some free time to address the points raised.

So what has changed? As a brief overview the node now has:

> Supports harmonic color schemes <
> Sample counts and seed values have been decoupled from one another <
> Seed values range range from 0 - 50 <
> Added hue variation amount slider <

The node has been split into 4 dedicated nodes, one to handle value variation, another hue, the original node (named basic) and a new one which supports harmonic color schemes.

The harmonic version, lets you choose between 5 different color harmony schemes and will generate variation in those colors.

Of course, the above is an extreme example to highlight the different modes, but you can keep the colors as subtle as you need.

All the old settings are still available. You can choose to preserve saturation and add random hue variation onto this as before. But sample count and seed values have been decoupled for all nodes. Meaning, you will no longer lose the value variation you were happy with, when changing the hue's seed values, and visa versa. 

Seed values are now integers ranging from 0 - 50 which hopefully brings it more inline with what the slider should be doing. Previously, there were a total of 100 possible increment values, which made the slider feel too sensitive and difficult to cycle through. There should be plenty of possible seeds to pick from still, but it wont be so difficult using the slider anymore.

In addition to this, I have documented the node with examples to show precisely what it does and how to make the most of it. Be sure to check out the update on my store!


Lets Do A Mentorship!

General / 14 September 2020

Hey all!

I have joined forces with Jeremy and crew to offer mentorships in all things material art! Check it out on the new and swish https://www.dinustyempire.com/mentorships/ben-wilson website =D

Over the last few years, iv dipped into making breakdowns, video tutorials and providing feedback to folk, and while I really enjoy this, its hard to provide anything meaningful through these short interactions. So my hope with these mentorships are to provide dedicated one on one time with artists to really dive into their work and spend quality time with them.

The goal is to focus around material art and the Substance tools, generally aimed at students or junior level artists (although this is not a requirement) and provide feedback, guidance and support. The type of artist I envision getting the most out of the mentorship are those looking to improve their portfolio or really solidify their understanding of Substance; Whether this is simple feedback or portfolio reviews, through to developing a clean work methodology and even programming with the API.

We decided to provide an additional offering outside of a full mentorship, as we know sometimes people just want a session or two of dedicated feedback and not pay for a full mentorship. So this is what the crash course is for.

Of course there are many fantastic artists offering mentorships now, so I hope these offerings don't get lost in the wind. But either way, I want to open up my time as another option for artists to improve.

I hope to work with you soon!

GDD - Insert Topic #4

General / 27 August 2020

Hey all!

I returned to chat with Alex Beddows about materials and the industry, this time along with the amazing Josh Lynch and James Lucas. If you have an hour, check it out!

bwTools v 1.3 release - New plugin - PBR Color Chart

General / 30 April 2020

Hey folks!

I have released version 1.3 of bwTools and it includes a new plugin! A pbr color chart. People who have already purchased the tools can get the new update for free on my store https://www.artstation.com/marketplace/p/ewNd/bwtools-substance-designer-plugin 

This update is only compatible with Designer version 2020.1.1+ !!!

This plugin is a convenient PBR color chart built directly into Designer. It provides various pbr values, based on DONTNOD, to quickly and easily reference without the need to having a downloaded color chart opened in windows. https://seblagarde.wordpress.com/2014/04/14/dontnod-physically-based-rendering-chart-for-unreal-engine-4/ 

It is always displayed ontop of the designer viewport, making it easy to color pick from

Swatches are select-able, drag-able and hide the UI to allow for easy comparison with your texture. Simply click and drag over the 2d view to compare values directly.

Up to 10 custom colors are supported. You can edit the colors and name as needed

Full documentation can be found https://www.artstation.com/benwilson/blog/lAPv/bwtools-documentation 

Thanks for the support and stay safe!

bwTools - Documentation

General / 24 March 2020

Hi all!

Today is the first release of a group of plugins I have been working on to help organize and layout our substance designer graph networks. In conjunction with this, comes the release of bwTools, a Substance Designer plugin consisting of the tools I have been working on and will provide a platform for me to share any future work. As a bonus, my previous optimize graph plugin is bundled with it. This post will serve as documentation for that, so for an overview see links below.

You can find an overview video here:


store page:


Please contact me for support through artstation or email!

Release Notes:

Version 1.3

- New plugin added : pbr color chart

  • A convenient pbr color chart built directly into designer
  • Based on DONTNOD unreal engine 4 pbr values
  • The color chart remains on top of Designer to make color picking easy
  • Color swatches are select-able, drag-able and hides all the UI to allow easy comparison with your texture
  • Supports up to 10 custom swatches

Version 1.2

- Fixed bug where some people were not able to load the plugin

Version 1.1

- Updated plugin to Substance Designer 2020.1.1 onwards. This update is not backwards compatible and will not work with Designer 2019!

- Fixed tooltips on toolbar icons



If you have a previous version installed, you need to delete the old bwTools folder inside C:\Users\Ben\Documents\Allegorithmic\Substance Designer\python\sduserplugins and restart designer.

Open Substance Designer and navigate to Tools > Plugin Manager...

Click Install at the bottom

 Navigate to your bwTools.sdplugin file and click open




bwTools consists of 2 parts. A toolbar at the top of the Substance Designer application and the various plugins which make up the tools.

All settings for individual plugins currently installed can be found in the settings window here.



Layout Graph

This tool is designed to help speed up the laborious task of neatly arranging your nodes. Is it best used as a helper tool when laying out your graph to your personal style and to make the most of it, we must understand how it wants to layout your node selection.

Node placement behavior

Nodes are always placed behind their outputs and always inline with the one which produces the longest straight line.

Nodes have a concept of height, which means they will correctly stack on each other.

However, be aware that due to a limitation with the Substance Designer API, the plugin assumes all inputs/outputs are visible. In the example below, the top two nodes have many hidden inputs/outputs, leaving artificial gaps.

Nodes which start a chain are called root nodes. These are left untouched and all nodes input into it will arrange accordingly. Therefore, it is important to provide enough space for the network to expand if there are multiple root nodes.

The Mainline Concept

The tool wants to find a mainline through your selection and provide space for other parts of the network to feed into it. It typically assumes the network with the longest chain is the mainline.

If it thinks your network is equally important, it will simply place them evenly.

This makes it possible to influence the layout based on  your selection.

Other nodes are inserted into the mainline relative to their input position.

The tool will generally favor the middle node chain if possible however.

The Network Cluster Concept

Group of related nodes will form network clusters and these are what feed into the mainline. They will also be given space and positioned such that they never overlap with the mainline. The darker frames below are network clusters.

Looping Networks

Nodes that loop back into the network at various points form looping networks. These are often very complicated and can sometimes stretch the entire length of the graph. 

While the tool will successfully handle these types of networks, it is often better layout your graph more contextually, using the tool as an aid to speed up the process. Taking the network above, we run the tool on smaller network clusters instead (shown in the darker frames) and position them more contextually and to fit your personal style.



You can define your hotkey here. Requires a Substance Designer restart

Node Width 

Sets the width of each node, generally you can leave this untouched.


Sets the distance between each node

Selection Count Warning

The plugin processing time is exponential, meaning large selections can take a very long time to compute. A warning is displayed before running the plugin if the number of selected nodes surpasses this threshold.

Consider Splits Nodes For Mainline

There are two styles for laying out the network. If Consider Split Nodes For Mainline is on, the algorithm will reason on split nodes first, generally preferring to use them as mainlines. This results visually larger encasing loops.

If Consider Split Nodes For Mainline is off, split nodes are given the same priority as everything else. The visual result here are more defined node clusters and grouping. Unless there are a lot of complicated looping networks in your selection, there may be no difference between the settings.



Straighten Connection

This tool will create dot nodes out of a given node to each of its connected outputs. Which helps reduce visual clutter and readability.

Dot nodes will be chained together.

Works on multiple selection too, handy to clean up the entire graph at the end of a working session.

There is a tool to remove dot nodes connected to your selected node too. Found in the toolbar


Straighten Selected Hotkey

You can define your hotkey here. Requires a Substance Designer restart

Remove Connected Dot Nodes Hotkey

You can define your hotkey here. Requires a Substance Designer restart

Distance From Input

Defines how far from the input of each node to place the dot node



PBR Color Chart

This is a convenient PBR color chart built directly into Designer. It provides various pbr values, based on DONTNOD, to quickly and easily reference without the need to having a color chart opened in windows. https://seblagarde.wordpress.com/2014/04/14/dontnod-physically-based-rendering-chart-for-unreal-engine-4/ 

It is always displayed ontop of the designer viewport, making it easy to color pick from

Swatches are select-able, drag-able and hide the UI to allow for easy comparison with your texture. Simply click and drag over the 2d view to compare values directly.

Up to 10 custom colors are supported. You can edit the colors and name as needed



Optimize Graph

This tool can be used to optimize various parts of your graph.

Remove Duplicate

Composite Nodes - Evaluate Input Chain

If this is on, the plugin will identify chains of nodes which are identical and remove them too

The plugin has some rules to what it regards a duplicate.

Settings must be identical for a node to be considered a duplicate

A node with an exposed parameter is not considered a duplicate

Uniform Color Nodes - Output Size

Will reduce all selected color nodes to 16x16, the optimal output size for a node in designer. Connected outputs are automatically set to relevant to parent

Blend Nodes - Ignore Alpha

Any selected blend node which only have grayscale inputs will have its alpha blending mode set to ignore alpha. 

Note: This setting requires a recompute of the graph, so is disabled by default. 

Graph Layout Plugin - Part 3

General / 27 February 2020

Hey folks!

Its been a while once again since my last post. Life got in the way again, quite literally this time, as my son was born just after new years! Hes super cute and very demanding! I did have the occasional spot of time to continue working on this plugin though so heres the update.

I took a step back a little and developed a tool to manage my plugins (spoiler!). I was often wanting to toggle settings with a nice little UI when trouble shooting, so I bit the bullet and built this thing. The nice part now is the UI dynamically builds itself based on a .json file. That way I can easily add modules or settings without having to rewrite any UI. From here on named bwTools!

But back to the main topic...I did a sort of re-write once again. After struggling with ironing out bugs, my logic was becoming very specific. So I went back and tried to simplify how I reason about the graph. Now instead of making an best guess about what a lane through a graph should be, the plugin tries to figure this out itself. This results in much more structured and understandable layouts. I am still doing everything is passes though, as this lets me make some assumptions about the state of the chain, so it was more of less the logic surrounding what a lane structure is that has changed.

Briefly, I first order the nodes into a proper hierarchy, then consider any chains that are deep, to more likely on the mainline. Sprinkle in some awkward setups such as chains equal in length, connecting to numerous parts of the graph or belonging on a different lane entirely and you a logic nightmare to solve!

You can notice on the .gif below however, that the blend nodes do not always assume the middle input is the mainline anymore. The other inputs also respect location and shift accordingly.

So if it does consider all the branches of a given node to be equally important, it will now divide them instead of trying to make lanes

With this, comes proper support for any number of inputs

Height has also been implemented, but with some drawback, unfortunately. There is no way of knowing how many input and output slots are actually visible and a lot of nodes have visibleif statements setup. The only information the API provides is the total number =( Until this gets added, I just had to reason on a node, assuming all slots are visible.

Another big challenge came with nodes that output multiple numbers to the same node. So now I try to make an educated guess by weighting all the inputs/outputs relative to each other. At the very least, it gives me a single value to work with, making it much easier to position nodes consistently.

So I still have an awful lot of weird bugs and behavior to figure out. I am trying to keep the logic as node agnostic as possible though and the results are starting to feel a lot more natural I think.

Im sure there are some tech artists face palming at me struggling through this, but we all start somewhere! It is now comfortable with most graphs, but I hope to solve this problem fully someday. 

Thanks for reading

Hiring Material Artists For Avatar Project - 1 Position (Full-time)

General / 29 October 2019

Hey all!

We have opened up a full time position for the Avatar Project down at Massive, Malmö!

This will mark the beginning of a core Material team for the project and the chance to help shape what that means. While we have many artists delivering texture content for the game, this role is the second dedicated to material creation and together we will bring the beautiful Pandora to life.

The world of Pandora is so lush and vibrant that it offers material work you rarely get in other projects. There are not many worlds which look quite as incredible as Pandora, especially at night!

All the details of the role are here, so please apply or reach out to me here on Artstation Messenger!


Graph Layout Plugin - Part 2

Work In Progress / 26 October 2019

In the last part, I had managed to get this project to a point where it could handle simple graphs pretty well and was working on solving recursive chains that split and branch back into each other. I was finding it very tough!

I showed the plugin to my tech director and he gave me some really good feedback, mostly related to how to approach the problem and general programming guidelines. Simply put, I had made the code so unwieldy and difficult to use that I could not hold all of it in my head or even debug properly. He set me the challenge of limiting all my functions to ~15 lines of code and with only 2-3 inputs; It really helped, thanks Christian!

So, I've rewritten the whole thing from scratch...

After spending some time trying to use it properly, I found the assumption of organizing an entire chain based on a single selected root node incredibly destructive. A lot of the time, I only wanted to quickly layout a small portion of the graph and leave other parts intact. So that's the first thing I fixed, it now works on your selection. I also hated clicking an icon, so it's now hot-keyed and supports a proper single undo. Previously it would undo one node at a time, ugh

This made working across multiple chains easy to implement, and can now handle multiple root nodes. In addition to this, placement now tries to find the longest horizontal in an attempt to produce the clearest results.

This means you can selectively manipulate node placement if you want too!

The biggest change however was with branching nodes (multiple inputs) and split nodes (multiple outputs). Previously I was recursively solving from the root (right to left), solving each branch as I got to it. Now however, I solve from the end to the chain up (left to right) and in an ordered fashion, which actually removed the need for recursion entirely and made node placement way easier.

So now chains originating from a split node are much more robust.

Its still being done in two passes like before, but now I only need to keep track of which split nodes have already been considered and if they need to be updated due to an offset.

Everything in the images so far are actually only solving along the x axis, I haven't got around to re-implementing the y offset yet, so that will be the next step. But I'm feeling happier with the development and think the algorithm is working much better now. The results in the gif below might look messy still (since its missing the y offset) but the x axis is solving correctly even for fairly complicated networks.

Thanks for reading!

Graph Layout Plugin - Part 1

General / 26 September 2019

In typical fashion, instead of finishing anything, I start something new. A plugin to organize Designer graphs!

This has proven to be a very interesting and challenging problem. A lot harder than I initially thought, but I have managed to reach a point where I can reliably sort a simple non recursive chain into my preferred layout style. 

The current implementation involves traversing down the chain building a coordinate system, then going through the chain again actually placing them according to the coordinates. The goal was to build these lane structures that respect the dimension of other parts of the network, so when finding a branch node (such as a blend), I step down each branch and return with its dimensions. This doesnt sound too bad, except how much to offset the nodes up and down also depends on which input slot the entire chain belongs in to begin with! It took some late nights and what was left of my balding hair, but I have a working solution now!

Networks that feed back into itself are a whole other beast, but I have made some progress here. There is a concept of a queue, where a split node (node with multiple outputs) will only position itself if all of its parents positions are known. If it cant successfully position itself, then it gets placed back into the queue, otherwise the whole process above repeats, building a brand new chain network. Theres are issues with this that I still need to work through, but its working well enough to show at least. So if there are any wizards reading this, tell me the magic! 

None the less, it has been a great exercise for me and I am learning a lot. In fact, the biggest challenge so far has been trying to work out exactly how I want the layout to behave and what that rule set is mathematically! Perhaps I can be a little better at blogging my process going forward too!

Thanks for reading!

Lets Talk Color Pickers - Part 2

General / 02 June 2019

Hey folks!

In my last blog post about color pickers, I was exploring a way to procedurally generate color charts based on an input color and exposing different variation sliders. Since then I got the chance to work on a Substance Source Signature Series which meant I got extensive time working with the node and I discovered some things I was not happy with.  Some revisions were made for the Source release, but these mainly related to removing the dependency on a px processor in order to work with the CPU engine better. What you see in that series is more of less the node I detailed in the previous blog, but CPU friendly. I do go through the inner workings of it during a live stream, so if your interested check that out or you can grab it directly from the .sbs files if you have a substance source subscription. https://youtu.be/jp2qOxJGzq8

Now however, I am doing another pass on the node. Giving it a big tidy up, making it more robust and reverting back to px processor based (A CPU friendly version is now on a switch, instead). Value and hue variance is done in two passes as before, except its now packaged with the node and inputs exposed. Additionally, there is a mask input to provide a way to blend back the input color, which is very helpful in making sure you don't stray from the original intention. I found I rarely used the saturation variation, so that's gone. Along with the seed offset sliders for each channel. In practice just having a single seed was more than enough and was barely used anyway.

The main problem I had was mostly to do with how I was generating samples. I was using the same value for both generating sample points with a tile generator and to dynamically control the output size of the color chart. This meant the sample counts grew exponentially and very quickly became noisy or nonsense data. So my first step was to fix this and generate a sensible number of samples points. This is now done with a 16x16 fx map so its super fast and much more understandable.

This did pose a new problem though, as when these samples upscale to full res, they were not interpolating correctly. So I also do my own linear interpolation during the upscale to ensure I get precise gradients between each value. Below are the sample points being linearly interpolated correctly.

Hopefully now the sample count is more understandable and intuitive. (Sorry for the .gif compression)

I was also unhappy with how the hue blending worked with low saturation colors. Previously I was forcing the Saturation to 1 with a HSL node in order to blend it back on top of the original color. While this does produce nice results, it had a weird side effect of brightening the overall values. Instead, I now convert to HSV, so when adding hue variance it will not affect the brightness. This is the default behavior for the node and means it will respect the original saturation correctly.

Of course, the hue variance slider remains. That is, how much to blend in the variation. And also the value variation and hue range sliders; How much to offset the value and hue respectfully. Except now that it is px processor based again, the hue offset is truly random, rather than a blend between two extremes.

As before, you can choose to blend the hue back on top instead of preserving Saturation, which now feels nicer with the HSV and sample changes. As you expect, some colors are better suited for this than others.

I also found soft light in particular has nice results, so that's available as well.

The graph independent seed also remains, which with the high hue values, allows for some really interesting colors!

Thanks for reading!