Lighting Artist Karim Yasser has told us how four different lighting setups were created for the Victorian Street project, explained the workflow in Unreal Engine 5, and spoke about using Nanite to create meshes.
Introduction
Hello! I’m Karim Yasser, I have been working as a Level and Lighting Artist for almost 3 years. I started my career in the games industry with different studios located in Egypt. After that, I worked in the film industry for a company called Post Office, based in Cairo, Egypt.
This summer, I will return to the game industry, as I will be working with Myrkur Games, which is located in Reykjavík, Iceland, as a Level and Lighting Artist for their new upcoming IP The Darken Echoes of The End. I have worked on many projects but most of them haven’t either been finished yet, or I don’t have the right to make them public. That is why my portfolio has only personal projects for now, but once these projects are done, I will publish them!
When it comes to learning, I usually depend on self-learning to acquire new skills, but I also believe that asking for feedback from experienced artists is pretty helpful. Also, I do some research about the jobs related to what I do to have then a solid understanding of what these companies need to have in their candidates.
Also, if I am targeting a specific company, I search well for their projects trying to know what is their art direction or more specifically, their game's genre so I can then highlight some projects in my portfolio to fit their needs to be a better candidate or just create new projects relevant to what they are doing.
Career Beginnings
Before I started learning Unreal Engine, I was really confused about which software to use – Unreal Engine or Unity?! Many people told me that Unreal is harder to learn as there were fewer resources than Unity at that time but I decided to choose Unreal as I believed that the more challenging software or something you are going to learn, the more it will make you better and unique from others.
I saw how amazing many projects were made with it and how many artists used it to create awesome projects which inspired me a lot in making a decision. I learned from many resources such as YouTube channels, the learning portal of Unreal Engine, and Unreal Engine Documentation.
Victorian Street: Idea and Planning
The idea and the inspiration were from Assassin’s Creed: Syndicate's E3 Cinematic Trailer. When I watched it, I was so impressed! The project started with some kind of medieval building style but then I decided to create the main building using assets that look like the Victorian era and are relevant to the trailer.
I started getting some frames from the trailer to get a better visualization of details, scene composition, crowd, lighting, etc. I always use PureRef to collect all these references together and split them into categories.
Blockout and Setting Main Scene Elements
For blocking out the scene, I just use the primitives of Unreal Engine (Cube, Cylinder, Plane, etc) just to have a rough idea of what I am doing and test the scale of the scene as if it is off-scale, many other kinds of stuff will be affected then such as lighting, texture stretching and other issues like this. As I use PBR materials and lighting, I have to be aware of the scale of these assets.
For the landscape, I first tried to add material from the Megascans library, it was good but not as perfect as I wished. It was very flat and needed a lot of materials on top of it. So, I had 2 options – using Virtual Heightfield Mesh to generate Displacement on the landscape and also adding other materials to paint manually in the landscape shader or to replace the landscape with static meshes. I did go with the second option as it’s more controllable and it will give me the results I need like the trailer of AC: Syndicate.
I wanted to have a ground of cobblestone with many layers of it as leafy grass, mud and soil, water puddles, and other rocky ground. So, in terms to achieve this approach, I used the Modeling Tools inside Unreal to create a very basic plane and then used Displace tool to add a Displacement Map on top of the SubDivided mesh. This approach is very heavy on performance but, thankfully, we have Nanite, the new Virtualized Geometry System, that gives us the ability to render pixel scale detail whilst having a very high poly-count in the scene in a very good framerate. I also uploaded a video on my YouTube channel in which I explained in detail each step I did go through to create these high poly meshes:
Some Nanite meshes I generated for the landscape:
Set-Dressing the Scene
Having a huge library from Quixel is something amazing, getting all these assets and materials for free is unbelievable! So, to use this huge library sufficiently, I picked up first some assets from collections such as Neo-Baroque Modular Building, Tundra, and some other materials for the ground (Cobblestone, Water Puddles, Dry Leafy Ground, Soil, etc), and as I explained before, I used my approach to convert these materials into Nanite meshes and placing all of them together and top of each other created a superb blending as Nanite automatically does that for you.
Using Megascans assets is very helpful in creating stunning environments in a few days and as I focus mainly on set-dressing levels and also creating different lighting scenarios, I heavily depend on this library, as it saves much time compared to the other workflow in which we create high/low poly version of each asset for baking and then texture it. Quixel Megascans library is just like a key for artists to push their limits in a shorter time with higher quality.
Lighting
Lighting is the most important element of your scene, it can pop up your work or ruin it, even if you did a great effort in your models, added a huge amount of details and your lighting isn’t good enough, it will ruin all of that. So, when it comes to lighting, I spend enough time trying different lighting scenarios and maybe each one has other sub-options. Actually, in this project, I had multiple lighting scenarios.
Before I start lighting, I create sub-levels inside Unreal Engine. Each level has the lighting actors inside it so, it becomes flexible and easy to switch between them and also edit each one on its own without affecting the other levels. The same approach could be applied when enabling world partition using Data Layers but, as I didn’t use World Partition for this project, I just used the standard workflow of the previous streaming method.
I also gathered some references from AC: Syndicate Trailer (for sunset and night lighting) and also from the Blade Runner 2049 movie (for overcast lighting) using PureRef.
As UE5 has its new Dynamic Global Illumination solution which is called Lumen, I surely turned it on to use Dynamic GI and Reflections. It’s quite easy to set up, I just enable it in the project settings, and also, I make sure to enable Generate Mesh Distance Field and Use Hardware Raytracing When Available as well to get the best possible results.
Getting References for Lighting
As usual, I used PureRef to collect all these references together but where can I actually get these references? Well, I use some websites for that. To get references from films, for example, I use a website called ShotDeck, it’s really handy and useful website to search and collect huge amount of references and explore cinematography. ArtStation! It’s for sure the artist’s friend, tons of artworks there for concept arts, 3D artwork, and more.
Another website I use is called DeviantArt, many awesome concept arts there for almost any genre you need to create. Also, browsing oil paintings on Pinterest is very helpful. I usually browse these websites when I have some free time so when I’m working on a project then, I go back to these and download what I need to add it to my mood board in PureRef.
General Workflow Applied to All Lighting Scenarios
In this project, I used Physically Based Lighting values so, to set it up properly, I first set my Exposure Compensation method in the Post Process Volume to “Manual” and leave it at ‘1’. You will notice the scene becomes black even if you added a directional light, that’s because the intensity of the sunlight isn’t enough so I set it to 3000.0 LUX and the Exposure Compensation to 2.5 to get more highlights (in case of sunset lighting) and feel like it’s an actual sun. Using Physically Based Lighting is impressive in calculating indirect lighting with Lumen to get better bounces and indirect diffused light and indirect shadow because of these light rays’ bounces.
In the case of Overcast lighting, I use the same pipeline but in terms to get low contrast between light and shadow (very soft light), in the Sky Atmosphere Actor, I increase the Mie Scattering Scale (while enabling Support Sky Atmosphere Affecting Height Fog) it gives the desired result of the foggy soft-looking without having highlights and contrast.
In Night lighting, the same workflow was used but there is a difference in that lighting scenario. I used here another source of light which is the street lamp. Street lamps tended to have warm yellow and soft light, which had been achieved by using a point light that has a Source Radius value of 50 to get rid of these hard shadows. The same was applied to the Main building’s door lamps and that overall gave a very nice result when it was used with Volumetric Fog and make some of these point lights cast volumetric shadows to get more realistic results.
Deep Dive Into Each Lighting Scenario
Sunset: As I got the reference for this lighting mood from AC: Syndicate trailer, I didn’t spend too much time searching for more references. In this one, I wanted to achieve what is much closer to the Complementary Color palette. The sunlight, which is my key (source) light, has a warm color, and I decided to make the sky looks cooler (blueish) as well as the shadows to make it closer to a golden hour.
Overcast: References for these two were from the Blade Runner 2049 film. The color palette for them was Analogous so I have then the opportunity and freedom to use one color with multiple tints and shades. I applied that approach in yellow color and blue color. The advantage of overcast lighting is it makes the objects pop up and show their true colors if the lighting was used correctly.
Night: its reference was also from AC: Syndicate trailer but I wanted to make it have lower exposure than the trailer. Also, going with a Complementary Color palette (as sunset) but the difference here is that the key or the source light has a blue color (cool) instead of the orange sunlight. Also, having practical lights in the scene which were street lamps was very important to create another focal point for the viewer.
Adding Another Layer of Detail with Fog Cards
After the lighting pass is done, I still feel like it’s some kind of flat lighting, many details are still hidden and didn’t really pop up. So, I start adding multiple layers of fog cards which is simply a cloud texture inside a material applied to a plane, it gives more realistic results and it gives more control in creating a local fog effect and also like another layer of exponential height fog so the colour palette will have tinted and shaded colour of the tone I use. For example, in the second overcast lighting the sky itself looks very flat with just one color so by adding fog sheets and adjusting its brightness and color, the sky will have actually 2 colors to have then a gradient effect in colors so it looks more interesting to look at.
Post-Process
When it comes to post-processing, it’s really important to balance the colors and adjust the brightness and contrast amount each one related to the other. I mainly use it to adjust Exposure Compensation and add some little color grading work for Highlights, Midtones, and shadows. Also, to control the base of screen effects and atmospherics like Bloom, and Vignetting. Also, it gives me the opportunity to control Lumen in terms of Quality, distance to trace, etc. There is a small option I use to improve the Lumen reflections in post-process volume, there is something called Ray Lighting Mode under Reflections in the Post Process Volume. By default, it’s set to Surface Cache. Ideally, I like to set it to Hit Lighting for Reflections as it adds specular highlights on the reflective surfaces which are more realistic but at the same time, it’s more expensive than Surface Cache.
So, the post-processing for me is like a color balancing tool to get more realistic-looking results to use during the post-production stage.
Rendering
As we have Movie Render Queue plug-in in Unreal, it has been most widely used for production rather than the regular render we had before. It gives the artist more freedom to control multiple things to improve the final results. Before I start adding the queue to the movie render queue, I create an OCIO config to convert my color space from Linear sRGB to ACEScg as the Linear sRGB doesn’t give a high dynamic range of colors so the highlights then wouldn’t be as intended. By using this technique or disabling the Tone Curve in the Color Output setting inside Movie Render Queue, I will be able then to get the actual value of the pixels that have a value more than ‘1’. Additionally, I need then to get a format that can support all this stuff, so I decided to go with an EXR format and keep its compression as its default (PIZ). Also, as I wanted to get sharper images, under the Anti-Aliasing Setting, I increased the Temporal Sample Count to 32 and overridden the method to None. 32 Samples were enough as I rendered them in 1080p resolution. I also used some Console Variables to control motion blur quality and depth of field quality. All these console variables are found in the documentation of the Movie Render Queue.
Conclusion
The project was very challenging for me as I wanted to achieve a cinematic trailer quality and I did then what is applicable to my skills. I believe that difficult and big challenges can be overcome by splitting them into many small tasks so, going through each step will definitely progress the entire process until it’s done. So, my advice is to keep trying even if you fail. Your persistence and dedication in what you are doing will certainly improve you and make you able to create something bigger and more challenging, it is just about taking the risk to be in a better situation then.
For Unreal Engine specifically, it may take a longer time to master compared to other software, so keep yourself motivated about what you are doing and never get disappointed even if your work wasn’t absolutely amazing, we were all started from the zero point and our work wasn’t perfect so, insisting on improving your skills is the most important matter in your career!
Karim Yasser, Level and Lighting Artist
Interview conducted by Theodore McKenzie
This content is brought to you by the collaboration of Unreal Engine and 80 Level. We strive to highlight the best stories in the gamedev and art industries. You can read more Unreal Engine interviews with developers here.