Essential Material Concepts

An introductory document on Materials in Unreal Engine.

Choose your operating system:

Windows

macOS

Linux

Materials in Unreal Engine define the surface properties of the objects in your scene. In the broadest sense, you can think of a Material as the "paint" that is applied to a mesh to control its visual appearance.

More specifically, Materials tell the engine exactly how a surface should interact with the light in your scene. Materials define every aspect of a surface, including color, reflectivity, roughness, transparency, and so on.

Shading Pipeline Overview

In a rendering pipeline, shaders are programs that define how each vertex or pixel should be rendered. Shaders in Unreal Engine are written in High Level Shading Language (HLSL). Shader code is then converted to a list of Assembly Language instructions that the GPU hardware can execute. This is how the final pixel colors are output to your display.

In the Unreal Editor you do not need to write HLSL code to create shaders for your project. Instead, you will create assets called Materials in a visual scripting interface called the Material Editor.

Materials

Materials are built by combining nodes called Material Expressions in a shader graph and passing the results into the inputs on the Main Material Node.

Simple walnut floor Material

Behind the scenes, these node graphs are silently translated to HLSL. As a user, you never need to view this code unless you want to. This makes Material creation in Unreal intuitive and approachable.

Material graph and HLSL code

You can view the HLSL code of a Material by going to Window > Shader Code > HLSL Code in the Material Editor. Note that the HLSL Code tab is read-only. You cannot directly edit compiled HLSL shader code within the Unreal Editor.

Materials Workflow Overview

This section provides a high-level overview of the Material creation process in Unreal Engine.

This is not a comprehensive step-by-step guide, but a broad conceptual overview. Read the pages in the Material Editor User Guide for detailed information about working in the Material Editor.

Creating a New Material

Materials in Unreal are an asset class just like Static Meshes, Textures, or Blueprints. You can create new Materials from the Content Browser:

  1. Right-click in the Content Browser

  2. Select Material in the Create Basic Asset setion of the context menu.

    Create Material

  3. A Material is created in the Content Browser. Give it a unique and descriptive name.

    Material thumbnail

Double-click the Material asset to begin editing the Material. The Material Editor window opens as shown below.

Click image to enlarge.

The highlighted region is called the Material Graph, and this is where you will do the majority of your work while creating Materials. The Material Graph in a new Material is empty except for the Main Material Node.

For a detailed breakdown of the Material Editor UI, read here.

Material Properties

When the Main Material Node is selected, the global properties and settings for the Material display in the Details panel.

Three of these settings are particularly important at the beginning of the Material creation process, as they form the underlying foundation of a Material and dictate how it can be used.

Detail properties

  • Material Domain – Defines what the Material will be used for in your project. For example, Surface, User Interface, and Post-process Materials are different Material Domains.

  • Blend Mode – Defines how the Material blends with the pixels behind it. For example, Opaque shaders completely occlude objects behind them, whereas Translucent and Additive shaders blend with the background in some way.

  • Shading Model – Defines how the Material interacts with light. Very often your Materials will simply use the Default Lit shading model. However, Unreal Engine includes specific Shading models for things like Hair, Cloth, and Skin which provide context-specific inputs to make it easier to create those types of surfaces.

These properties determine exactly which inputs are enabled on the Main Material Node. In the image above, Opacity is grayed out because the Opaque blend mode does not support transparency.

If you select the Translucent Blend Mode, the Opacity input is available, and several inputs that were previously enabled are grayed out.

Translucent blend mode

When you create a new Material, it is recommended that you configure these three properties first.

Read the Material Properties documentation for information about the rest of the properties in the details panel.

Material Expression Nodes

If Material Properties are the foundation, Material Expressions are the building blocks of a Material.

Material Expression nodes

Each Material Expression performs a specific action in the Material graph. Technically, a Material Expression is simply a visual representation of a snippet of HLSL code. When you combine Material Expressions you are writing an HLSL shader without ever seeing the code itself.

Data is passed between Material Expressions by dragging a cable connection from the output pin of one node to an input pin of another.

Connecting Nodes

Simple surfaces might only require a few Material Expressions to define the Material, as below where the three texture samples carry most of the weight. The only other nodes in this graph are there to give artists finer control over the Roughness strength.

Simple Material

This could be a finished Material, or you could continue refining the surface using math and logic in the Material graph. Understanding how to combine Material expressions to achieve specific results in your Materials is the basis of Material Creation in Unreal.

Read here to learn how to place Material Expressions in your graph.

Unreal Engine includes dozens of Material Expression nodes. Most of them have mouseover tooltips, but you can read the Material Expressions Reference pages to learn what each node is used for.

The Main Material Node

Data flows from left to right in the Material graph, and the Main Material Node is the end-point of every Material network.

The Main Material Node contains the final input pins that determine what information is compiled with the Material. Material Expressions in your graph do not affect the Material unless they are part of a chain that connects to the Main Material Node.

In the video above, notice that the Material preview only updates once the Texture Samples are connected to their corresponding inputs on the Main Material Node.

Every input on the Main Material node defines a specific aspect of the overall Material. These two pages will help you understand what each input is used for:

  1. Physically Based Materials – Explains the principles and best practices of a Unreal's Physically Based Materials workflow.

  2. Material Inputs – Explains what each input on the Main Material Node does.

Compile and Apply

Changes to a Material cannot be seen in the level until the Material is compiled. To compile a Material, click the Apply or Save button in the toolbar at the top of the Material Editor.

Compile and Apply

After compilation, you can drag a Material directly from the Content Browser onto any Actor in your level.

Drag Material onto Actor

Compilation can take a few seconds, or up to several minutes for complex Materials. This can potentially bottleneck your efforts when developing and testing Materials, but there are several ways to minimize compilation delays.

Material Instancing is one strategy to improve iteration time and avoid lengthy compilation delays while you work. Read more about instancing below.

Material Editor User Guide

The procedure outlined above covers the basic Materials workflow in Unreal Engine. Each one of the steps discussed above is documented more comprehensively in the Material Editor User Guide.

It is recommended you read these pages to get started with Material creation:

  1. Material Editor User Interface

  2. Placing Material Expressions and Functions

  3. Using the Main Material Node

  4. Previewing and Applying Materials

  5. Organizing a Material Graph

Workflow Efficiency Concepts

The Materials you create are very rarely single-use assets. Authoring an entirely new shader for every Actor in your project is inefficient, particularly because similar assets tend to require very similar Materials.

Material Instances and Material Functions make it easier to customize and reuse Materials so that you can iterate faster and avoid doing the same work twice.

Material Instances and Parameterization

Material Instances let you quickly create multiple variations, or instances, from a single parent Material.

Instances are used when a group of related assets require the same basic Material, but with different superficial characteristics. An example might be a piece of furniture that has several color variations.

Chair Material instances

Material Instancing lets you create a single parent Material for the furniture set. You would then create a Material Instance for each color, as shown above on the chairs.

There are several advantages gained from using instances:

  • You can customize Material Instances without recompiling the parent Material. This means changes you make to instances are visible immediately, in all viewports.

  • You can expose parameters to artists in the Material Instance Editor. This means they can quickly and intuitively create variations of a Material without ever editing the more complicated node graph.

Read the Material instances learning track here.

Material Functions

Material Functions let you package parts of a Material graph into a reusable asset that you can share to a common library and easily insert into other Materials.

Their purpose is to streamline Material creation by giving instant access to commonly used networks of Material nodes.

For example, the Blend_Overlay function shown below contains the entire Material expression network shown on the right side of the image. Instead of constructing this node network over and over, you can insert it directly into your graph from the function library.

Material Function example

The Unreal Editor includes several dozen premade Material Functions. You can edit any Material Function to alter its behavior or create your own functions directly in the editor.

Read more about creating and using Material Functions here.