Unreal Engine - Reroute Node

Tutorial / 21 February 2025

I think reroute nodes are fairly well-known, but there were a few things I didn’t realize at first that made them much faster and more useful to work with.



There are two ways to create reroute nodes. 

The first method is by right-clicking on the event graph—either with a clean right-click or while dragging a connection—and then typing "Reroute" in the context-sensitive menu.

The second method is even quicker: you can simply double-click on a connection line to create a reroute node instantly. This is a much faster and more efficient way to add them. One approach I like to use with reroute nodes is bringing a single connection strand closer to where the information is needed and then branching out from there. This helps avoid having multiple independent cables crossing over other blueprint nodes. 

As shown in the example above, this method keeps things much cleaner especially when the data source is far from where it's needed.
Another way to stay organized is by adding comments and colours to reroute nodes. This makes it easier to quickly understand what a variable represents at a glance. While this isn’t always necessary when the source is nearby, it becomes incredibly helpful when dealing with distant or complex node setups.

Report

Unreal Engine - Simple can be great (Snowflake)

Tutorial / 17 February 2025

Not a super lengthy post but more of a reminder that sometimes taking the simple path can still lead to some great results. Not everything needs to be super technical and mind-blowing. 

This year I'm thinking about better ways of working and trying out different methods. This was a flow flake material I made using no textures or masks and then added it into a floating Niagara system. Simple, clean and efficient.


Report

Unreal Engine - Camera Angle Lerp

General / 16 February 2025

Straight out of the '90s with its iconic colour-shifting car paints, this material replicates the effect by using the camera vector to track the player's position.

Two images plugged into a lerp with the alpha controlling the camera vector. This is normalized and plugged into a Dot product (multiplies two vectors together and sums up the results of those multiplications) with a constant vector 3 and a max clamp.


Set up the material instance with two different images:

Screenshot example with camera position halfway:


Video example:





Report

Unreal Engine - Parallax Texture

Tutorial / 14 February 2025

This is an excellent material that never fails to impress. It is easy to produce and has multiple applications in various projects.

Set up a basic material and use a bump offset node with texture coordinates for placement like below:


Use a material instance to control the parameters and texture image:


Use the texture on a panel. This is a great way to fake room interiors from the outside.


Video example:


Report

Unreal Engine - Checking a scene and Optimization

Tutorial / 13 February 2025

When starting to optimise in unreal it's a good idea to have a workflow and process to follow. 

My Process


It's important to take metrics using the inbuild tools and other software like render doc to record and pinpoint areas of improvement. Use the unreal profiling tools to identify which parts of your game are causing the most strain on your CPU and GPU.

Take metrics. The first is to just keep your focus on Frame Render Time rather than the framerate itself. You can use commands such as 'Stat unit', stat fps, stat gpu, stat game and profilegpu to get an idea of what is causing the possible bottleneck. Set up a Notion page or whatever your project is using and make it accessible to everyone. Record everything here and document when large batches of assets were added and built etc.




The GPU visualizer and Statistics are your friends


When building a scene it's important to check the GPU visualizer (ctrl,shift and ,) regularly to see where the resources are being used and how you can manage them better.


Statistics (Tools > Audit > Statistics) gives you an in-depth review of all the assets in the scene, you can check a lot of important information here very quickly and is an absolute must for scene optimization. 

Remove all of the unnecessary work first, then start to try to make the slowest function faster.



The Buffer Visualization will give you a quick overview of all render elements.

Light Complexity: check for too many overlapping lights


Lightmap Density (Red being a larger texture and blue is smaller) 


Shader complexity. Check for overly complex Materials. Red is usually an issue. (This tree has some problems... )

Quad Overdraw. Multiple polygons are all overlapping and being rendered within the same quad, too much overlapping translucency or lack of LODs and maybe some distance culling can help


Assets

Optimize Your Assets: High-quality assets can add a lot to your game's visuals, but they can also slow down performance. Use Unreal Engine's LOD system to reduce the number of polygons in your assets when they're far away from the player, and use textures with lower resolutions to reduce the GPU load.

Ways to optimise assets after ingestion:

  • Use Mip Maps and Texture Groups correctly.
  • Maximum Texture Size will set a new in-game resolution.
  • Edit selection in Properties Matrix. (Great for bulk changes)
  • Reduce the poly count on assets in the engine by using Mesh details/ Reduction Setting / Percent Triangles


Duplicate Mesh Assets within the same sub-Level

Usually, when building out a scene after blocking, you'll be using lots of the same asset. This will add lots of draw calls and start to affect performance. Using the in-editor 'Merge' tool is great for creating collections of assets that you know will need to be placed around for set dressing. But also consider using 'Hierarchical Instancing'. I would recommend always keeping a backup of the un-optimized level or keeping the original assets set to invisible and hidden in gameplay. This is to avoid any unnecessary work when you're asked to change something on the level you just finished optimising. ><

Culling

Culling is a technique that prevents objects that are not visible from being rendered, which can help reduce the number of draw calls and improve performance. Use techniques like occlusion culling, frustum culling, and distance culling to optimize your game's performance. This can be done in a culling volume or individually in the asset's details panel.


Master Materials and Material Functions

Set them up as early as you can with the project. Optimise them and use them efficiently on all assets. Making one change in the master material will affect hundreds of assets. Yes, you'll be unpopular as the shaders will need to recompile but it's better than having to manually change hundreds of materials over and over.


Polycount and Texture Sizes

It's great creating 8k textures for beautiful 200k poly assets, but is it coherent with the game's release platform? Is it a character, hero asset, Mid-ground prop or a background environment dressing? Set up some standards and a pipeline to follow for artists at the start of the project.

Tip. Background assets might not ORMS texture. If you can't see a difference then it's probably a big performance boost right there. 


LOD Coloration

I don't use this often but it's a good habit to get into. It allows you to visualize the LODs in your scene to see objects missing LODs and switch between LODs too quickly or not quickly enough.


Check the Lighting

Lighting can have a significant impact on your game's performance. Project requirements will be specific but dynamic moveable lights are expensive and you should try to use baked lighting where needed and reduce the amount of real-time lighting needed. Creating a sub-level set as a lighting scenario is a great way to avoid the use of dynamic lights and still have two static states. Depending on the project there will be various solutions. You could have a moveable dynamic light moving with the character, or use a trigger box activation when a player teleports into a location. Think about why you need dynamic lighting and shadows and is there a way to fake it?

Doing a lighting bake can help increase the frame rate.

Rebuilding Reflection Spheres can remove artefacts from the level and ensure that all lighting components are within the same map.


Level streaming and Sub-Levels

Level streaming is a technique that allows you to divide your game world into smaller, more manageable chunks. This can help reduce the amount of memory your game needs to load and can improve performance by only loading the necessary parts of the game world at any given time. It also allows several members of the team to work on individual sublevels without version control issues.

Usually, I set up a level using these sub-levels where applicable:

  • SL_Mesh
  • SL_Lighting
  • SL_Env
  • SL_Anims
  • SL_Audio
  • SL_FX


Post-Process Volumes

Post-process effects like bloom, motion blur, and depth of field can add a lot to your game's visuals, but they can also start to impact the performance.


Use LODs for Particle Effects 

Particle effects can be very taxing on your GPU or CPU, especially when there are many of them on screen at once. Check the materials and textures and use LODs to reduce the number of particles that are rendered when they're far away from the player.


Blueprints

Use Blueprints Efficiently: Blueprints can be a powerful tool in Unreal Engine, but they can also slow down performance if not used efficiently. Use blueprint nativization to convert frequently used blueprints to C++ code and optimize them for better performance.


My fail-safes

At this point, if you've done all this and you're still getting low frame rates or rendering issues you would normally be in trouble. But before hitting the panic button try these to identify the issue:

  • Create a new level and add the assets back in. Did you know that if you have two editors or the same project open you can just cut and paste into new maps?
  • Turn off the visibility of items in the details panel, or remove them.
  • Check project settings. Not seeing any bloom... is it turned on?
  • Is the project broken? Copy the Contents folder into a new project and test again.


Good Luck! ><

Report

Unreal Engine - Vertex Painting

Tutorial / 12 February 2025

Vertex painting allows you to paint between two or more materials. This is great for creating realistic blended edges or adding damage effects to objects.

 Create a material with different textures to want to apply. Use a vertex colour node to combine them. Make a note of which RGB channels are controlling which texture.




A lerp node would also be suitable, but a Height Lerp node using a height texture will help blend it and influence the result with more realism. 


When using vertex painting, the more vertices on the mesh the higher the accuracy resolution. This can cause optimisation issues later if you are using multiple assets and landscapes with extremely dense polycounts.


In the editor, select Mesh Paint Mode and select Paint. Use the channels to select the texture and then start painting directly onto the asset. You're creating a mask so white is positive and will be seen whilst black will remain hidden.



Example result of vertex painting within the editor:





Report

Unreal Engine - Oil Paint Post Process

General / 17 April 2024

Another process of applying an Oil Paint effect during runtime is achieved with a little bit of HLSL magic:

This creates a blocky artistic look, and works well in VR, creating a stylised and dream-like environment. The algorithm code creates a Gaussian blur filter for each pixel and its relative neighbouring one. The intensities are then divided and the most common intensity is used to create a new colour. This is the post-process material set-up I used:

A custom expression node (float 2) is used to correct the wrong scene size due to multiple viewport sizes. Whilst the post-processing material works fine at runtime, it's very inconvenient to work with in the editor.

Using SceneTexture: PostprocessInput0  to get the image to be rendered, a parameter to change the radius of the effect, texture coordinates of the processed pixel and the custom expression node that will hold the computation. The 'SceneUV' node is also a custom expression node which needs to be set to Float 2 and you can use this code: return GetDefaultSceneTextureUV(Parameters, 14);

Setup the material nodes as follows:

The code can be copied and pasted from the end. The original image without post-process effect:

Tweaking the contract and Effect Radius for the desired effect. In editor, a value of 10 is pretty nice, but doesn't translate in screenshots.

I used a value of 30 which looks insane but does work better:

The code was originally created by Ferkizue, their original blog can be found here. https://ferkizue.blogspot.com/2018/04/oil-painting-post-process-effect-in.html


The Custom expression code for copy and paste:

 int TexIndex = 14;

 int intensityCount[10];

 float avgR[10];

 float avgG[10];

 float avgB[10];

  for (int iLevel = 0; iLevel < 10; iLevel++){

     intensityCount[iLevel] = 0;

     avgR[iLevel] = 0.0;

     avgG[iLevel] = 0.0;

     avgB[iLevel] = 0.0;

  }

 //COUNT INTENSITIES

 uv *= 0.5;

 for (int i = 0; i < radius; ++i)

 {

     int offsetI = -1 *(radius / 2) + i;

     float v = uv.y + offsetI * invSize.y;

     int temp = i * radius;

     for (int j = 0; j < radius; ++j)

    {

         int offsetJ = -(radius / 2) + j;

         float u = uv.x + offsetJ * invSize.x;

         float2 uvShifted = uv + float2(u, v);

         float3 tex = SceneTextureLookup(uvShifted, TexIndex, false);


        float currentIntensity = ((tex.r + tex.g + tex.b) / 3 * 10);

        intensityCount[currentIntensity]++;

        avgR[currentIntensity] += tex.r;

        avgG[currentIntensity] += tex.g;

        avgB[currentIntensity] += tex.b;

    }

  }

 float maxIntensity = 0;

 int maxIndex = 0;

 //FIND CORRECT MOST COMMON INTENSITY LEVEL

 for(int cLevel = 0; cLevel < 10; cLevel++){

     if(intensityCount[cLevel] > maxIntensity){

         maxIntensity = intensityCount[cLevel];

         maxIndex = cLevel;

     }

  }

 float newR = avgR[maxIndex] / maxIntensity;

 float newG = avgG[maxIndex] / maxIntensity;

 float newB = avgB[maxIndex] / maxIntensity;

 float4 res = float4(newR, newG, newB, 1.0);

 return res;

Report

Unreal Engine - My Material Functions Set up

Tutorial / 29 March 2024

Material Functions are powerful and a necessity for any project. Having just a few will increase your workflow dramatically and help save time when creating new materials. Material Functions are little snippets of Material graphs that can be saved in packages and reused across multiple Materials. 

Material Functions allow complex Material Graph networks to be saved out and quickly reused in other Materials, while also allowing more complex networks to be abstracted into single nodes, making material creation easier for artists. Best of all, edits to a single function are propagated throughout all networks which use it. So, if you need to make a fix or change to how a function works, you will not have to make further edits to the many materials which may be using that function. 

Here are a few of mine in more detail. 

MF_Albedo is a fairly basic material function which will allow you to change the texture map, desaturation, brightness and contrast:

MF_Albedo_Detailed adds another texture map with a lerp and scalar parameter, layered with a blended overlay. A switch has been added but it's necessary:

MF_Albedo_Light gives only control over the texture map and a tint parameter. Very useful for keeping things simple and not resource-heavy:

As above the same principles can be applied to other texture maps. The MF_Normal has a Flatten normal parameter to control the intensity. Very useful to help bring up details or knock back textures which are looking too strong:

And of course, there's nothing wrong with adding a little extra flavour to a material by adding another Normal map. The texture coordinate scalars and flatten normal functions will give that needed control to avoid mismatches. When using the coordinate scalar, the texture map must be tileable or you'll get edge lines:

MF_ORMS connects directly into AO, Roughness, Metallic and Specular with basic parameter controls:

MF_ORMS_Detailed adds another texture map and layers them using a Lerp and Blend overlay:

MF_ORMS_Light is probably used the most. Providing limited parameter control it's perfect for premade assets:

Using the material custom UV element is slightly cheaper than adding texture coordinates for UV control into all the texture maps. Adding a simple material function to control this can be really quick and useful:

Material Function nodes can be dropped into your custom material. They may look simple and almost the same, but can be incredibly complicated. Creating a set of custom Materials functions and Master Materials are the break and butter of a digital unreal artist and will continue to grow and develop as your knowledge increases.

M_Basic:

M_Basic_Detailed:

M_Basic_Adv:

If you want to check them out or add them to your own, download them here.  They have been built in 4.27 and you can just drop them into the project contents folder. :)

Report

Ten Principles for Good Level Design

General / 18 March 2024

Level design is always something that fascinates me. Sometimes I get to contribute my ideas in projects with the game design and Environment Artists. I always have a quick read-through of these which distils the art and science of level design down to a concentrated set of fundamental principles for innovation, engagement, and immersion.

Quick guide breakdown:

  • Good-level design is fun to navigate but throws in some chaos.

  • Level design is driven by mechanics.

  • Work backwards to create an emotional response using level mechanics

  • Do not rely on just audio or words to tell a story.

  • It tells the player what to do, but not how to do it by giving clear objectives.

  • Constantly teaches the player something new with new mechanics

  • Surprise players by taking risks and changing aesthetics or pacing.

  • Use risk reward so players can choose their own difficulty dynamically.

  • Design of non-linearity, bidirectionality, modularity and efficiency.

  • Embrace the escapism and empower the player.

 

Although it's a few years old, in this video Dan Taylor provides a Ramsian-style breakdown of how to create world-class levels.

Watch the full video here: https://www.youtube.com/watch?v=iNEe3KhMvXM










Report

How to tell a story with your illustrations

General / 17 March 2024

This post was taken from an article originally published in issue 170 of ImagineFX by Abigail Larson.

Get better at storytelling through art.

Decide on your story Ascertain what the mood is in your story. An illustration is a companion to a story. So while a story typically starts with a character, try to think about the tale you’re telling. What kind of setting will it have, what the mood should be, how expressive are the poses, and so on. Think about the situation you want to depict, and if you want, act it out and shoot some photos for reference to help you understand how people move naturally in various situations. Then sketch them out loosely. This is a great way to warm up for your final concept.

Create character poses

Study your subject to get to know what they are like. Get to know the subject of your art. If you’re going to be drawing them multiple times throughout, say, a picture book, get a few poses down on paper to look back on as reference when you’ll need to position the character in a certain setting for an illustration later on.

Keep sketches loose

Create loose sketches to capture your designs. It’s tempting to jump right into your final sketch if you have a specific idea bubbling around in your head, but it’s still a good idea to produce some loose sketches first. These quick gestures will show right away if the pose and composition are right. As such, it’ll be easier to fix these issues in a loose drawing, rather than a final or detailed sketch. This is also a good time to play around with different features for your character, such as facial features, and their clothing and equipment.

Consider movement

Adding movement brings drama and an edge to your work. Having a sense of movement in your illustration helps their eyes move around the composition and explore what’s happening. Think about your characters in loose shapes while you’re planning your piece. How are they interacting with the rest of the scene and other characters? How do their postures change? Do their shoulders tilt? Is their back arched? Above all, are the subjects in harmony with each other?

Check your shapesContrast and silhouette help create shapes. For tackling the form of your subject to convey a message to the viewer, think about the subject of your drawing in a silhouette. This helps you understand their shape in the composition, and you can see how you might want to position them in a way that describes the mood and story of the illustration.

Do warm-up studies

Study objects when warming up. It’s helpful when mapping out your art to take some time to practise the focal points in your piece before going into the first sketch. I like to do studies of the objects I’ll want to add as details and do some figure studies to warm up. This is also good practice even when you’re not planning a new piece, but simply want to keep in form.

Be expressive 
It's not just facial features you should focus on. Your character’s expression isn't limited to their facial features. Expression can be found in their pose and movement, and interaction with their environment and other characters. Exaggerating features like wide eyes and upturned eyebrows can express fear, and slightly lowered eyelids and curved lips can show contentment. Note: pulling too far in any direction can lead to your character looking cartoonish.

Show weight 
Draping of clothing can add drama and gravitas to your character. Think about the effect of gravity on your character. Are they positioned in a normal setting, or are they floating or falling? How does the drape of their clothing or hair change? If there’s a strong wind, the character’s hair and clothes will reflect that, and if the air is still, the drapery should hang down.A character with billowing clothes and hair often adds drama, so if the situation calls for it, bear in mind the direction of the movement.

Convey emotion through colour
Choose warm or cool colours to depict the scene's mood. You can convey emotion with a figure’s expression, but also with the mood of your piece. A sad illustration might show a character looking down, with emphasis on a 'low' emotional state, and using a desaturated colour palette can accentuate this. Warmer, more saturated colours present a happier mood, and desaturated cooler colours do the opposite.

Play tricks with colour
Learn more about colour theory to improve your work. It’s important to understand the fundamentals of colour theory, but you can learn from observing nature and studying your favourite artists to see what palettes you enjoy the most. Rich, vibrant colours like reds and purples can convey passion and power, cooler subdued tones can give a calm, or even bleak and sad feeling and warmer tones can add a sense of comfort and serenity.

Bring balance 
Create harmony in your composition by balancing your characters and environments. Lots of practice studies will help you find balance in your composition. Ideally, you’ll want to have your characters and their environment to be harmonious with each other. This starts with a composition that enables the viewer’s eyes to move around the scene with ease and is helped by the use of colour and tone, which will set the subjects apart from each other and their environment, while still being connected to it.

Make use of tones 
Greyscale is your friend in working out the tone. Before colouring a piece, I lower the piece to 50 per cent grey in Photoshop, then bring out or push back each item in greyscale. I do this at the beginning, so I can see if I have the right amount of contrast in my piece overall, and that it reads easily to the viewer.

Get to know your setting 
Try painting your background first before adding in your characters. Even if I don’t need to draw an entire room or landscape for an illustration, I like to sketch it out in its entirety anyway, just so I can get an idea of the setting, and understand the space and perspective. In some cases, I’ll paint the background separately, and then have the subject dropped in on another layer in Photoshop so that I can move them around if I need to.

Think about costume
The contents of a character's wardrobe can reveal their identity. What a character wears tells the viewer more about them, so it’s important to consider their wardrobe when you’re planning your illustration. What’s the time period? What are they doing in this scene? If it’s a fantasy character, you get a lot of room for design, but it does help to have some kind of historical context to base their costume on and build from there.

Bring the story to life with details. 
Give your viewer hints about the character's backstory. A character in a setting isn’t quite enough to tell their story. This is when details come in. Small details in the costume, or in objects in the room or environment will help make the composition more interesting, and it will give the viewer more hints about the story. 


Report