Website powered by

Lethal Rush - Panning Materials in Unreal Engine 4

Here's a quick overview of the moving (slightly overkill) materials I made through Unreal Engine 4 for Lethal Rush, an entry for the Ubisoft 2019 Game Lab competition. In short, it made use of the Panner and Sine nodes within a Master Material to allow simple translations of textures and quick generation of material instances.

The game's art direction was inspired by TV shows' flashy, glamorous LED screens. My goal was to offer enough eye-candy for players without distracting them too much from their race.

I did not have the mathematic and tech background to reproduce complex fractals and abstract forms, so I settled with distracting the eye with varying types of 2D texture translations.

I did not have the mathematic and tech background to reproduce complex fractals and abstract forms, so I settled with distracting the eye with varying types of 2D texture translations.

The emissive input as well as the Bloom post-process was what caught the eye the most, and I had intended the Master Material to be used for deferred decals, so I knew I could play with the Base Color, Emissive, and Opacity/Mask inputs.

The emissive input as well as the Bloom post-process was what caught the eye the most, and I had intended the Master Material to be used for deferred decals, so I knew I could play with the Base Color, Emissive, and Opacity/Mask inputs.

I really wanted as much control as I could directly inside UE4 for mundane tweaks such as Offset, Tiling, and Rotation. These nodes were repeated for all material inputs because I wanted to be able to adjust them independently.

I really wanted as much control as I could directly inside UE4 for mundane tweaks such as Offset, Tiling, and Rotation. These nodes were repeated for all material inputs because I wanted to be able to adjust them independently.

A closer look at my setup. I had 2 texture inputs for the opacity mask because I wanted one for the overall shape of the moving material and another for micro details. I used the save UV modifiers for both inputs, but I could have just as well split them.

A closer look at my setup. I had 2 texture inputs for the opacity mask because I wanted one for the overall shape of the moving material and another for micro details. I used the save UV modifiers for both inputs, but I could have just as well split them.

 RGB texture packing for the masks was really useful.  I decided on a shape, then packed a few variations in the same texture to be able to quickly test out different combinations or quickly generate material instance variants.

RGB texture packing for the masks was really useful. I decided on a shape, then packed a few variations in the same texture to be able to quickly test out different combinations or quickly generate material instance variants.

Now, the fun part: movement. The panner node was neat to affect vertical/horizontal translation, but I wanted to add a bit more "bounce" to it all, so I slapped a sine node into all the Offset and Tiling nodes in the material.

Now, the fun part: movement. The panner node was neat to affect vertical/horizontal translation, but I wanted to add a bit more "bounce" to it all, so I slapped a sine node into all the Offset and Tiling nodes in the material.

I wanted the Panner parameters to be independent from the Tiling and Offset parameters because I wanted to leave the former for big, overall translations, whereas the latter would be used just to add some small delay to the cadence.

I wanted the Panner parameters to be independent from the Tiling and Offset parameters because I wanted to leave the former for big, overall translations, whereas the latter would be used just to add some small delay to the cadence.

These are what each material instances ended up with. It was slightly overkill since I was being cheeky and didn't use some of the parameters in the final build, but when I was building it, I had many "what if" scenarios in mind.

These are what each material instances ended up with. It was slightly overkill since I was being cheeky and didn't use some of the parameters in the final build, but when I was building it, I had many "what if" scenarios in mind.

This is a fraction of the end result with different masks and parameter tweaks. More variety could have been generated with additional masks and parameter tweaks.

This is a fraction of the end result with different masks and parameter tweaks. More variety could have been generated with additional masks and parameter tweaks.