Last Light

Last Light is a collaboration piece I made together with artist Oliver Lincke. It was made using Unreal Engine 5.6 in 5 weeks half-time during the Specialization course at The Game Assembly. Oliver approached me with the concept and I thought it looked cool, so we decided to work together on this. 


I mainly focused on Shaders, Particles and Technical solutions while he focused on Asset creation, landscaping, textures, rendering and lighting. Both of us worked heavily in the materials and the sequencer, so it was important to keep good communication during the project.

Goals:

  • Collaboration with artist Oliver
  • Corrupting nature shader solution
  • Wind for grass and leaves
  • Create artist friendly tools
  • Supporting Particles

Corruption System

Corruption System overview:

  • Last Light Blueprint writing corruption data (like radius and position) to the Material Parameter Collection.
  • Material Parameter collection holds data for other systems.
  • Material functions make corruption data accessible for shaders.
  • Function lib contains corruption functions for Blueprints
  • Niagara Parameter collection mirroring data for particle systems
  • Corruption data is centralized, which makes sure that corruption affects everything consistently, but also enables each part to be corrupted in its own way

Last light BP:

  • Moving the Blueprint communicates its location to all corruptible objects in the level.
  • Additively control Soft and Hard radius of non-corrupted area with capped sliders.
  • Cleansing boolean used to signal when corruption gets cleansed.

Corruption Soft Radius

Corruption Hard Radius

Corruption Effects

Withering Grass and Flowers

Dying Fireflies

Corrupted Grass has a different color, a vertex offset and a withered opacity mask. The same goes for flowers.

In addition to fading out over it's life time, the fireflies opacity is also tied to corruption with a randomized offset to make sure not all fireflies die at the same time.

Withering Wood

Withering Leaves

The wood surface is withered using Vertex Offset combined with a noise texture to create this effect. All colors are also desaturated, including the Vertex-painted moss.

Similar to the grass, the leaves change color, vertex offset and opacity mask when corrupted. It also has reduced movement in the wind to make it look more stiff and dried out.

Cleansing the Corruption

Explosion

This idea came about halfway through the project when assembling everything together for the shot. At first, the video was supposed to end on a sad note with the Willow and the Last Light overtaken by corruption.


Since the Corruption system worked well in both direction, we thought it would be fun for the Last Light to give a Last Stand against the corruption and cleanse it with a big explosion. This ending felt a little too happy though, so we made the crystal crack and go out in the end, paying a price for the cleanse.

Eroding Vines

The corrupting vines get cleansed away with an erosion calculation inside the vine's material. I had to add a Cleansing bool to the Last Light for the vines to only erode when cleansing the corruption and not while it is moving towards the Willow.

Wind System

The Wind system uses a similar design to the Corruption system, which controls wind direction and intensity for materials and particle systems. 

Wind Controller Blueprint:

  • Similar to Last Light BP.
  • Rotation of the actor controls the wind direction.
  • Wind intensity is applied to everything, but the effect can be modified in shaders or particle systems.
  • Writes data into a Material Parameter Collection.
  • Niagara Parameter Collection Mirrors data.
  • No blueprints use the wind, so a Blueprint function library was not necessary.
  • Overall, a very similar design to the corruption system with centralized data that can be interpreted by different systems.

Leaf Material

The willow tree's leaf material is one of the more complicated materials in the scene. Both of us worked on it a lot, and it was a big challenge to get it looking good. It has a lot of specialized interaction with both the Wind System and the Corruption System. The hanging leaves are vertex-painted to be more affected by the wind than the rest of the crown. 

Vertex painted for wind

Rotation based on Wind Intensity

Thorn Vine Splines

At the start of the project, we planned to use splines to animate the corruption vines throughout the scene, and we made sure to prototype this early to see if it would work.

The Problems with Splines

Problems?

Unreal splines have an infamous problem where the spline mesh will twist when going upwards and crossing the Z-axis.

We also had trouble making it animate smoothly when rendering and causing some performance bugs. These are all solvable problems, but in order to save time and not dive too deep into this rabbit hole, we chose to pivot into another solution. 

Solutions!

Instead of using splines, we made a few different meshes that we animated in the Unreal Sequence. We also added vertex animation to make it less stiff-looking. My favorite is the Corrupted Vine Doughnut that we use a lot in the background.

Reflections

Working Together

We had daily syncs in the morning during the project and we were constantly iterating and testing stuff out. It was a great way to inspire and motivate each other and a good way to get a lot of regular feedback. I think it is a lot more fun to work in a group to help each other and to amplify each other's work. 

Check out Oliver's Portfolio here

Audio by Jacob Lincke

Lessons Learned

  • Locking down timing early is important since the longer you work, the harder it is to change.
  • Prototype fast and early in order to know if you need to pivot and cut stuff as soon as possible.
  • The importance of creating clean material graphs and artist-friendly variables and communicating these.