[SHELVED] Material Layering Feedback for 4.19

We’re excited to announce that we’ve added support for Material Layers in Unreal Engine 4.19 as an experimental feature. Below is some basic documentation to get you started using the feature. Also, if you have any feedback regarding the use of Material Layering, please post in this thread.

Thank you!

To enable this feature, navigate to the Project Settings > Rendering > Experimental and set **Support **Material Layers true.


**Material Layering **is a new way to combine materials in a stack, which builds out the correct material graph without needing to build the node graph by hand. There are two new asset types that we use to do this:

  • Material Layer
  • Material Layer Blends

Functionally, these behave similarly to Material Functions. These new asset types also enable you to create child instances, which you could not do with Material Functions.

**Material Layer **assets have a default input node which pipes base Material Attributes in from the Material. Material Layer Blend assets have two default input nodes which enable you to access the Material Attributes from layers above and below.


Once you have created a Material Layer and Material Layer Blend asset, you can combine them using a Material Attributes Layers node in a Material. With the node selected, you can add layers and set the assets that each layer and blend should from the node Details panel.


When editing a Material Instance with a parent Material that contains a Material Attribute Layers node, the Material Instance Editor also contains a Layer Parameters tab. Here, you can change the assets used for any of the existing Layers or Blends that have been set. Use the Add (+) button to add additional Layers to the stack as needed. You can also see the parameters contained in each of the Material Layer and Material Layer Blends and override their values individually by entering a new one.


Passing Parameters to Layers

There are three main methods at present to do this, most of which apply to Blends and Layers.

  1. Create a parameter within the layer which behaves similarly to existing Materials and Material Functions.
Parameters added within the layer graphs will be unique to that layer and editable within the layer's section. Even if multiple copies of the same layer are added, each will have its own copy of that parameter to control.
  1. Use the Input pin to the Material Attribute Layers stack.
This takes another Material Attributes as input which will be piped into every layer added. For example, we could pass a base normal map for the mesh as an input, like so:


Then within our example Material Layer, we get the Input and blend in:


Each layer can optionally use or ignore the base stack material attributes input. Currently, this method is not accessible within a blend graph.

uhmm interesting!
as it’s not yet explained anywhere yet, I have to ask: what’s the difference between this new system and the old Layered Materials thing?

I think the key part is “without needing to build the node graph by hand”. This allows you to keep each material layer as a separate material asset instead of making a jumbo mateial graph.

So, in the example in that document, if you wanted to change the copper portions of the rocket to something with animated flames (because then it will go faster) - you would need to make a new material. If you had a Material Attribute Layers stack that blended together a Rocket_Body layer and a Rocket_Details layer with the mask, you could change Rocket_Details to any Material Layer you wanted (AnimatedFlames, Psychedelic, or Copper) without needing different master materials.

Does that help clarify a bit?

I gave material layering system a spin in 4.19 and overall I don’t expect any significant benefit from it. At least not within a scope of projects currently within my reach.
Firstly, changing existing uber shader in a more or less developed project to work with new material layering seems a bit on the painful side and definitely not worth the effort.
Secondly, With the way I’m building master mats, I could hardly find few occasions where matlayer system would be more convenient, than existing set of material functions.
Thirdly… well, there is no thirdly.

I see potential for the system only only in two directions. First being fresh projects made from scratch, where all the planning was done with the system in mind.
Second being a usage case where all asset texturing is done exclusively in the engine, potentially involving baking blended mat attributes into textures.

That is my impression so far.

so it sounds like hassle-free upgrade to Layered Materials

either of your 2 directions drive me to the same conclusion I had before with Layered Materials: I can’t think of it as something for production due to the shader complexity derived from it


This will reduce mastermaterial pipelines a lot and make freedome for designer/artists who will be not restricted to handmade mastermaterials anymore :slight_smile:

Btw a question.

Maybe this feature later will allow us layered physical material too? ^^ :rolleyes:

Sounds Interesting.

What is the performance of this kind of Materials setup compared to make one big graph ?

I assume this designed for/around the Paragon character material workflow?

This is SWEET

This is a cool feature, definitely needed. We could have a good degree of modularity with functions already, but with this things will become more natural. I hope this will leave the experimental status in 4.20.

Please make sure it going to work on Android devices. They have many limits in the mats. I hope it will work well there first.

…Is there any noticeable performance improvements over the traditional material layering…? otherwise it’s really hard to justify the use of material layering here and there, regardless of how it’s done.

What controls can we expect to have when working with a Dynamic Material Instance inside of a Blueprint? So far I haven’t been able to find anything that isn’t changing the standard material parameters.

@Maximum-Dev I don’t expect any, seems just like a workflow QOL thing
this would really benefit from Dynamic Branching :slight_smile:

Will this work with decals? Eg floating ones…

I will definitely use it on my game under development, but thinking on Content Creators they will mostly prefer to stick with compatibility over several engine versions than bringing something new just because it is new.

… … I’ve been waiting 19 engine versions for this!


Right now we haven’t hooked up Blueprint controls for this, because we’re planning out what will be the smoothest workflow for users. Right now if we did expose something, you’d have to manually type in the parameter name, as well as the index of the layer or blend, and that’s not ideal. Definitely keep posted though, it’s something we will be working on before we remove experimental status.

So, the biggest gains will be if your project currently has a lot of master materials that are similar except for one section of graph, or has lots of reuse of different functions or blend types. For one material each done in the old way vs. the new way, the shader complexity should be similar. As you get more materials and instances though, if you set up the new material stacks well, you can end up with a lot of savings.