News - Joined the team at!

News / 11 May 2019

Hi everyone,

I'm very happy to share the news with you all that I've been brought in as the new Lead Substance Material Artist at!

It's everything I've been hoping for and working hard to get over the past several months, so I'm really excited about it! Thank you to all of you for supporting and encouraging me as this is what gave me the confidence to keep pushing for this. It's been a dream of mine to be able to focus professionally on my Substance Designer work, and I feel very lucky and privileged to be able to do so. I can't wait to see what new things I'll learn from the team, and hopefully I'll have a thing or two to share with them too.

It does mean though that I won't have as much time for working on personal projects, particularly the UE4 environment project. I hope I can keep it going, but will just have to see. As for my personal Substance Designer projects: I highly doubt I'll be able to keep myself away from that! ;) In fact I've got a few things in the works that I hope to be able to share with you soon.


My First UE4 Environment - Update 2

Work In Progress / 26 February 2019

Hi everyone.

I took a short break from this project recently to finish and release my wave filter pack and was away for a few days, but I'm back on it this week and thought I'd update you on some of my progress.

One of my main focuses has been to get learning blueprint visual scripting, which is something I've been keen to learn for some time. As any of you who have seen my Substance Designer material studies and work with custom nodes will know, I have a love of the more technical side of game art and firmly believe in the power of procedural workflows. So I wanted to apply this approach to working in UE4. The balusters on the staircases banister seemed like the perfect place to start.

The goal was to create a blueprint actor that would spawn a given number of baluster meshes evenly spaced along a spline path. I decided that I could probably get away with using just one baluster mesh, providing each instance is rotated on it's Z axis by a random multiple of 90 degrees to create the necessary breakup in repetition. If this proves not to be enough, I could adapt it to use an array for selection of more baluster meshes but I'll see how I get on. To make it as easy as possible to position it correctly in the scene, I wanted it work when the spline points are placed in the same X and Y positions as the newel posts. This meant that the width of the newel posts had to be factored in to ensure the space at each end matched the spaces in-between balusters, so I included a variable for inputting this value.

The above image shows the result with 4 copies of the blueprint for each of the 4 spaces between newel posts. Once the paths were setup correctly I could just change the baluster count based on my reference images.

The above shows the parameters used by the long banister on the lower part of the staircase.

And here's the construction script graph. I really should comment it I know, but bare in mind it's still a work in progress. ;)

I've also made some of the lighting fixture meshes. I thought these should also be blueprint objects so that I can attach lights to them and set the light defaults for all instances from within the blueprint. Also, the ceiling lights hang from the ceiling by chains, and due to the sloping ceiling they needed to have different chain lengths. So I made the chain lengths parametric. The pivot is set to the centre of the canopy (ceiling attachment) so they can just be placed in the correct position on the ceiling. The position of the shade is then determined by the number of links in the chain, which is controlled per instance by a 'chain link count' parameter. I used the reference images to get the approximate chain lengths for all the hanging lamp blueprint actors. Each chain link is rotated by 90 degrees on it's Z axis and then this can be randomised with the 'random rotation angle' parameter. A value of 25 degrees seems to provide a nice level of variation.

I also included a 'light is on?' parameter to easily switch the light component on or off.

Again, no comments, but all of this is still subject to change at this stage. There's still a lot for me to learn about blueprints, and I may come across better ways of handling these scenarios, but for now they're working pretty well.

I've also made a start on some of the textures/materials. Mostly just the tileables for now using world space coordinates to eradicate seams and stretching. Some of the materials aren't looking quite right at the moment, which I think has to do with the lack of lights in the daylight scene. Oh, and I've started trying to set up the lighting scenarios, which also needs some attention to get it working correctly.

That's all for now. More updates to come.

Thanks for reading!

Free Wave Filter Node Pack - Documentation

General / 18 February 2019

Hey everyone.

If you read my recent blog post you'll know that I'm currently spending a lot of my time learning UE4 and attempting to make my first real-time environment. This isn't leaving me much time to make Substance Designer materials (except the ones used in the environment which you'll get to see later), hence the drought lately. As a way of saying thank you to you all for following me and continuing to take an interest in my work, I'm releasing a free node pack containing some potentially very useful wave filters:

  • Sine Wave
  • Sawtooth
  • Plateaus
  • Wave Filters

Wave Filters basically just allows for quick selection of the main waveforms: sine, square, triangle and sawtooth. Triangle is just sawtooth with it's peak set to 0.5, and square is just a clamped triangle. The pack is available to download from my Gumroad.

This post is intended to act as the documentation for the nodes, so I've put together some examples of what the different filters and their various settings do.

The following examples show the effects of the different filters on simple gradient inputs:

Now what about on some peril noise:

And finally let's see it on something more complex, like fractal noise:

And now for the parameters:

Sine Wave:

Applies a sine wave filter to the grayscale input.

Wave Count (float):    Sets the number of waves.

Wave Offset (float):    Offsets the wave phase.


Sawtooth filter with controls for changing the offset and peak position. Peak position can also be varied using a custom mask input.

Tooth Count (float):    Sets the number of teeth (same as wave count above).

Phase Offset (float):    Offsets the sawtooth phase (same as wave offset above).

Peak Position (float):    Sets the position of the sawtooth's peak.

Use Custom Peak Input? (boolean):    When set to true, peak position is overridden by a custom mask input. This allows for setting the peak position on a per pixel basis.

Custom Peak Range (float2):    Only available when 'Use Custom Peak Input?' is true. 'Peak Position at Min' is the peak position represented by black on the mask input and 'Peak Position at Max' is the position represented by white.


Plateaus filter with controls for changing the offset and slope depth. Slope depth can also be varied using a custom mask input.

Plateau Count (float):    Sets the number of plateaus (flat levels).

Offset (float):    Offsets the plateau phase.

Slope Depth (float):    Sets the depth of the slopes between plateaus. At a value of 0 the slopes are vertical, at 1 the slopes completely replace the plateaus and the output matches the input.

Use Custom Slope Input? (boolean):    When set to true, slope depth is overridden by a custom slope input. This allows for setting the slope depth on a per pixel basis.

Custom Slope Range (float2):    Only available when 'Use Custom Slope Input?' is true. 'Slope at Min' is the slope depth represented by black on the mask input and 'Slope at Max' is the depth represented by white.

Plateaus also outputs some pretty useful masks:

  • Plateaus:    The flat areas.
  • Slopes:    The slopes with parameters for tweaking the selection.
  • Steepness:    Black at horizontal parts, white at vertical parts. Has parameters for changing the intensity and for inverting.
  • Height Difference:    Basically the input ran through a sawtooth filter.

You should be able to easily extrapolate whatever masks you want from the ones provided, but I've also included some parameters for tweaking them. The parameters are all pretty self explanatory. 

Wave Filters:

A collection of wave filters based on the main waveforms: sine; square; triangle; sawtooth.

As mentioned before this node is basically a sine wave and modified sawtooth nodes. The parameter names are more standardised and it doesn't include the custom mask input functionality. The majority of parameters are the same as above, except for 'Square Wave Slopes'.

Square Wave Slopes (float):    Sets the slope depth between the black and white values. At a value of 0 the slopes are totally vertical, at 1 the wave profile matches that of a triangle wave.

And that covers it. They're fairly simple filters but I'm sure you'll agree there's a lot of potential with them. One idea is to combine them with curve nodes (I know, right!). Here's my attempt at using the Plateaus to create a Colorado/Arizona like terrain material. I hope that they come in handy to some of you. Have fun creating, and please let me know what you think. Perhaps give me a shoutout if you use them in your material studies.


Update - My First UE4 Environment.

Work In Progress / 06 February 2019

Hi everyone,

It's been a couple of months now since my last post and I thought I should take the time to explain and update you all on my current situation. Firstly, thank you all so much for following me and encouraging me, and a big thanks to those of you who have supported me by buying my materials. It's really appreciated! The reaction I've had from all of you has helped to give me the confidence to leave my job of 10 years to pursue a career in the video games industry, something I've wanted to do since I left university. As I'm sure you can tell from my portfolio, I'm passionate about texturing and materials. I'd love to become a material/texture artist in the industry, but those jobs seem fairly rare. So I'm looking to build on the skills I've developed as a generalist and transition into an environment artist, a position that's much more common and would allow me to still do a lot of texturing work. So I'm currently putting all my time into learning Unreal Engine 4 and building my first environment!

I toyed around with a lot of different ideas about what to make. I wanted something that was an enclosed space, not too big, and not too complex or cluttered (I don't want to run before I can walk!). I decided in the end to make Matt Murdock's apartment from the Netflix Daredevil series. I gathered as much reference from the show as I could and began blocking out the space. Here's what I've managed to get into the engine so far:

I've been mostly focusing on light mapping this week... I've had better weeks. Still, it all needs to be learnt. I'm making plenty of mistakes, but that's okay because it's the best way to learn. I'm intending to do 2 different lighting setups using UE4's lighting scenarios: daytime and night. This will help me get to grips with lighting a scene almost entirely from exterior light, as well as a scene that's all manmade lighting. I've also attempted to make it as modular as possible, but that's caused some light map seams. I'm contemplating merging some of the meshes together into larger, more contiguous meshes. There's also an issue with the skirting boards. They all come out dark when I build the lighting. I've checked the normals and they're not inverted, so if anyone's got any idea what's going on there I'd love to hear from you. :)

Anyway, there's lots to do so I'm going to park the light map stuff for now and get onto making some of the primary props and lighting fixtures. I'll post more progress on this over the coming weeks. Comments and criticisms are welcome. Advice is even more welcome! ;) 


Protrude From Height - custom Substance Designer node

General / 13 September 2018

Hi everyone.

I just wanted to share with you all a custom Substance Designer node that I created that's proved to be really handy in lots of situations. I used it in my cracked paint material, and it'll be used again in plenty of my future materials.

I've called this node "Protrude From Height". Not the most snappy name I know, but I think it's pretty descriptive. The purpose of it is basically to allow the user to easily put one height on top of another height. For example, if you wanted to put small rocks on top of an area of varied terrain, or maybe put barnacles and limpets onto rocks. I've made some diagrams to better explain what the node and it's settings actually do.

This shows the two heights I used in my examples and the resulting output (settings = Height Balance: 0.333, Blur Amount: 8, Mask Edge Blur: 1.5).

Height Balance

This shows the effect of changing the 'height balance' setting. The combined heights are normalised to the stay within the 0-1 range and the maximum amount of height depth possible is allocated to each height input. The secondary height is then pushed up by the primary height so that it sits on top.

Blur Amount

This shows the effect of changing the 'blur amount' setting. This blurs the height that the secondary input is pushed up by, reducing how closely the secondary height follows the contours of the primary height. If set to 0, all the roughness of the primary height is passed through to the secondary.

Mask Edge Blur

If 'blur amount' is set to a very high value two things will happen:

  1. The secondary height will sink in high areas, and raise up in low areas.
  2. Any raised up shapes will have steep edges which causes stretching/stepping artifacts...

To fix this I've included a 'mask edge blur' setting which softens off the edges of the mask used to add the 'pushed up' secondary height to the primary. This mask represent the silhouette of the shapes in the secondary height and assumes that all but a height of 0 (black) should be pushed up. This mask can be overridden by setting 'use custom mask' to true. The node also outputs a mask of the parts of the secondary height that protrude above the primary, which can be used to apply different colour, roughness etc. to the protrusions.

For anyone who's interested in the node but doesn't want to buy a whole material to get it, I've made it available separately on my Gumroad at - If you've already bought a material that includes the node (currently just the cracked paint) an update will be available shortly that includes the latest version of the node. I hope some of you find this as useful as I have. Enjoy!