Senior Lighting Artist Tom Bentkowski talked about the development process behind Imagine, the winner of Epic's Better Light Than Ever challenge, shared the lighting setup in UE5, explained how the LEGO bricks shader was made, and spoke about creating the stop-motion-like effect.
Introduction
Hello everyone, my name is Tom Bentkowski. I’m currently privileged to be a part of Respawn’s Star Wars Jedi: Survivor team as a Senior Lighting Artist.
You may recognize me from my Twitter account, Artstation, or the Unreal Engine subreddit, and as for my professional work, I hope you’ve enjoyed Observer: System Redux, Gamedec, and Netflix’s romantic drama Through My Window, for which I also created a few environments with Unreal Engine.
The Imagine Project
Imagine was made for the Unreal Engine lighting challenge Better Light Than Never. I knew I needed to participate, and this was my main goal – just to create something awesome for this event. The timeframe of the challenge was a very busy period, and at the end of May, my dreams came true – my second child was born, and I started working on my beloved franchise.
When I managed to sit down to create a project for the challenge, I doodled a basic idea which was everything that I usually do – darkness, fog, a moody environment – without any discovery or experience. Initially, I picked the easiest and the most boring way.
I had trouble polishing it and finding an anchor point for magic and amusement, which is what lighting does for me. I needed a story, something honest, authentic, and straight from the heart. I failed.
For the next few weeks, I sunk into my work and parenthood and witnessed people I admire working on their submissions until a week before the deadline, by which time I had already given up on participating in the contest. Before putting my 3-year-old daughter to bed, I played with some LEGOs with her, and then an idea came to me.
The pure beauty of imagination on her small table. Multiverse stories about Tusken Raiders selling ice cream to Doc Ock and Darth Maul, Spider-Man healing animals in a veterinary clinic, Luke Skywalker waiting to take a ride from Miles Morales – a world without bounds.
I was touched because I knew that so many of us share the same memories about LEGO bricks. That evening, I sat down and searched for the tool that would allow me to create 3D LEGO sets and export them to Unreal Engine 5. I had the image in my head, with this small table and the magic of imagination still happening when no one can see – Disney/Pixar-ish thing that always touches our hearts.
Setting Up LEGO Bricks
After some searching, I found BrickLink’s Studio 2.0 and its enormous library of bricks and LEGO sets. I spent a couple of hours just playing with the editor. I then picked out the first set to export. To accomplish this, I simply exported the model in the COLLADA DAE format, opened it in Blender, and saved it as a .FBX to allow me to import it into UE.
Creating the Green Plastic Shader
Once in Unreal Engine, I knew I had to set up a proper plastic shader to sell the LEGO feeling. The shader itself is very simple the trick to making it look believable is in the details; scratches and fingerprints in the Roughness Map, which are themselves an unexceptional part of a brick's look, but on a simple surface like this, all the imperfections add to the believability.
I settled on a Triplanar Material Function for texture mapping because I wanted to avoid setting up UVs for every brick. Triplanar is a way to use textures without UVs because it projects the texture on top of the model from all three dimensions.
I played with Roughness differences to get my LEGO brick base material finalized.
The Lighting Setup
Unreal Engine 5 is the perfect environment to play with LEGO. Thanks to the Nanite system, it’s possible to have an almost infinite number of bricks, and LEGO sets transitioned into real-time 3D. A common problem with Nanite workflows is that the textures need to catch up with geometry quality, so it’s easy to go beyond texture pool memory. With LEGO, there is one material for each brick, and you only instance colors – the perfect solution.
As I’ve already mentioned, setting proper UVs for each brick could be a pain. The same usually goes for Lightmap UVs, but thanks to Lumen – it’s a story of the past.
Bricks work perfectly with Lumen, so after picking up some pre-built model sets, I placed simple boxes as walls and set up very generic bedroom furniture because I wanted to spend more time on what is happening on the table itself and to give it more focus.
I knew that the main light source would be the window behind the table, so in addition to a Directional Light, I placed a small Rect Light just to simulate how ambient skylight would pass through the window and into the room, in addition to the direct light source.
I increased the Global Illumination (GI) strength of the Rect Light, with Indirect Intensity set to 12, just to see Lumen doing its job and to generate a more bounced lighting.
The next step was to create additional local lighting just to enhance the composition and make the assets shine. For the shadows, I used Distance Field Shadows, they worked well with the bricks and gave the ability to soften the shadow penumbra, which is a big deal for selling realism, especially in closeup shots.
I wanted to create focus in the middle of the composition; the warm window light is needed to break the dominant blue cast of the scene, as well as to make sure that viewers don’t see this tint as an effect of heavy grading.
On the left, I added some food leftovers – I like to introduce things like that to enhance the story a bit and prevent the whole environment from looking like it only exists for this one specific shot and has no story besides what we can see. I also placed a picture frame with a photo of my daughter holding her brother for the first time because that was happening in real life for me at the time, and I wanted to save it.
By this point, the scene felt quite good, however, I still had one more thing to set up once I had placed plants in the scene – Translucency.
Translucency sells both the organic plant look and thin plastic – it’s a small but significant detail that plays like a dream with blueish moonlight. Translucency is an effect of light passing through and scattering inside the surface of the material – this effect is best seen on the leaves or thin fabrics, such as curtains.
To set up Translucency, you need to set the shading model to SubSurface.
Then, you need to create simple controls over the color and intensity of SubSurface Scattering (SSS) and attach it to the SubSurface Color.
After this last step in production, it was time to start post-production – to color grade and tweak some effects within the Post-Process Volume. I made the image slightly less contrasty and more blueish with global color grading settings, and then to make it all a bit more stylized, I played with bloom.
Under the advanced Bloom settings, I changed every cascade, and with 2 of them, I introduced slight color aberration. The goal was to soften the image and make a more dense atmosphere without messing with Volumetric Fog. This helped with a magical night feeling and pushed the whole render towards something between looking stylized and realistic.
The final touch was adding a Film Grain effect, which adds a photographic look to the image. The subtle movement in the grain does not necessarily draw attention to itself, if used carefully, but adds life to the image, making it more interesting. Unfortunately, I lost the grain during rendering, which I’ll talk about later.
Camera Settings and DoF
At first, I wanted to prepare some simple close-ups, with slow movement to show how cool these bricks look. I found some angles and amplified the Depth of Field (DoF) effect in the Cine Camera Actor by pushing the Min/Max F-stop to around f/0.2. This isn’t a very realistic real-world value for a lens aperture, but it works for the shot to establish a forced shallow focal depth, and a macro lens feeling for the shots. To do it in a more physically correct way, I’d recommend using longer focal length lenses with a larger film back and creating close-ups with realistic F-stop values.
To bring more life to the camera movement and create some sort of “being a witness” feeling for the viewers, I added a hand-held camera shake motion. To create this effect, you can use either the Virtual Camera plug-in and record everything with your iOS device or a Camera Shake Blueprint, the method I chose for the project.
This blueprint uses Perlin Noise to affect the camera's rotation and position in a random way. Please note that even Perlin Noise, with its seamlessness, feels repetitive and slightly procedural. To avoid that, simply create another Blueprint with slightly different values and place those two under the camera, bringing the result closer to the random shake of human hands operating the camera.
To bind everything, at some point, I always try to look for sound effects. In this animation, I wanted to go with some smooth jazz, but when I was searching for old pieces, I came across a song called By The Light of The Silvery Moon, recorded by Billy Murray and Haydn Quartet. This music went straight into my heart, and both the title and the lyrics felt like a perfect match. After putting it into my sequence, I instantly got old Disney animation vibes.
Stop Motion
I came up with an overall story within the next couple of minutes after listening to the music, and I just trusted my gut and began to animate. For this, I knew what approach I needed to take since I watched tons of stop motion animations made with LEGO bricks for research. I wanted to animate it with clumsiness like I was a child playing.
Stop motion animation is basically taking a photo of an object at frame 0, moving it, and then making another photo for frame 1, then another and another, and so on. Combining those, you’ll have stop-motion movement. Creating this type of animation is time-consuming, so often these types of animations are made with around 12 frames per second for a 24 FPS release format – sometimes it’s less, sometimes more – it’s a purely artistic, and sometimes financial, decision.
Unreal Engine is running in real-time, as is my camera, so I needed to use constant keyframes, which instead of creating a smooth path from one key to another, change values in the desired frame.
Here you can see the difference between these frames. The first transition is smooth while the second contains steps.
I began by syncing light with the music. In Sequencer, I simply adjusted the intensity of lights or set the Emissive Intensity for lights using Lumen GI.
Here, you can see the sequence with all the light widgets:
After that, I began to work on a car, making it something of the main hero that wakes the whole table up for a party. I moved them without any specific frame count to maintain this non-professional look. I placed more keyframes when I wanted the car to move faster and less to slow it down. Then I moved the rest of the sets and made them dance and fly with the music.
For the flying Stardestroyer and Rocket, I decided to switch to smooth animation to separate the magical movement of the bricks with something more physical. The rest was the matter of syncing it up with the music. I placed music and SFX and then prepared the final audio line in Premiere Pro using preview render.
For the final render in Unreal Engine 5, I used the Movie Render Queue, set to High-Quality Render and Anti-Aliasing – everything pretty standard, nothing fancy. Upon looking at the first render, I noticed that the GI was flickering.
After some research, it occurred to me that my Anti-Aliasing passes were causing this, so I tried different types of AA, and after setting Temporal Sample Count to 8, which is low, the flickering GI artifacts went away. The negative side effect of this new setting was that I lost the film grain effect in the process of rendering. I assume that this is caused by the AA, but this was right about time to post my submission, so I didn’t have any more time to resolve the issue.
My initial sequence was around 41 seconds, and I thought passing the 30-second limit from the rules would not be a big problem, but rules are rules, so I was asked by the moderators to make another cut for the submission. Ten seconds is a lot in this animation, so the submitted cut lacks some of the magic of the full 40-second version. My bad from the beginning, but what came out of those 40 seconds was worth everything.
Conclusion
During the production process, the most useful tool for me was Lumen, as I’d assume is the case for almost every Lighting Artist. The ability to iterate and play with light angles, tones, colors, etc. without waiting to bake lighting and having instant visual feedback is the next level. No more lightmap problems, no more adjustments between static and movable objects – everything looks great. Lumen is a great tool and it’s our job to adjust and use it as best as we can and enjoy that Unreal Engine has made our job easier. Thanks to that, we can focus on the artistic side of lighting, which we all love.
In the end, I want to thank Unreal Engine, Sketchfab, and KitBash 3D for this challenge, it’s been a great opportunity for many of us to once again do something purely artistic – I hope to see more challenges in the near future. I want to thank all my friends and teammates who always encourage me to do what I love and are always ready with feedback. Thanks to my kids – I hope one day I’ll inspire you as you inspire me every day.
Last but not least, congratulations to all participants for finding the time and strength to do this challenge. I surfed through all the submissions, and I saw love and passion everywhere. I am sure that through this challenge many people discovered something game-changing in their approaches and some discovered love for lighting. Great job!