Sander Agelink shared the workflow behind the Grand Foyer project, talked about working with references, and explained why Unreal Engine 5 was chosen for lighting.
Hi! My name is Sander Agelink. I’m a student in my final year of college at the Breda University of Applied Science. I’m currently interning at Ubisoft Massive as an Environment Artist.
I initially planned to create something akin to the Ornstein & Smough boss arena from Dark Souls. While researching various Baroque interiors, I stumbled upon the Grand Foyer in the Palais Garnier in Paris. I fell in love with its design, so instead of a scene from Dark Souls, I started to look for ways I could recreate this scene in Unreal Engine. It is a highly detailed scene, so it was going to be an exciting challenge to break it down into something manageable.
For each project, I like to set a series of goals and constraints. For this one, these were:
- Limited, simple shaders
- As few textures as possible
- Higher polycount allowed
- Multiple materials per asset allowed
The goal was to make a highly detailed scene and somehow condense the number of assets and textures to something that’s manageable to do and wouldn’t take up too much hard drive space.
I started by looking for repetition in the real hallway. Some obvious things that stood out were the doors and the pillars, so I started with a simple blockout in Unreal Engine. This helped with establishing how many assets I needed, how the scale would work with the camera, and how basic lighting would affect the environment.
Something I like to do early on in a project is texturing the floor. Throughout the project, the floor often acted as an anchor point – something to compare your assets or your lighting against. It also functions as a motivator to get through the bulk of the work that comes after.
There were no fancy tricks while making the floor. I was still running on the initial boost of excitement from starting a new project, so I took the time to make a 100% accurate rendition of the floor in the Grand Foyer.
The trim sheet for it is simple but, with carefully crafted geometry and UVs, it allowed for lots of small and sharp details, even if the textures were to be low res due to the cut-off points from the UVs.
Next up is the bulk of the project. Having a blockout to start with helps with planning, but I needed a better idea of how long each asset would take to produce. Therefore, I decided to start with the pillar as a benchmark asset.
To speed up the process, I collected and created small ornament pieces. I used them to kitbash together detailed high poly shapes that I then would bake down onto a low poly asset. These I did in Maya instead of ZBrush so I could keep a better track of all the small shapes and their low poly counterparts.
To keep the file light and the texture bake small, I only made a quarter of the pillar a straight piece. I then tiled the low poly mesh 4 times and bent it into a cylinder to create the final pillar.
With the pillar complete, I realized that doing this for every asset would take way too long. So the challenge with this project wasn’t so much how I made the assets but instead how much of it I could recycle and get away with it.
While making the pillar, I realized that several of its patterns repeated throughout the hallway. Before making any more assets, I thoroughly went through countless images of the real hallway and highlighted every repeating pattern. In conclusion, 75% of the textures could be made out of these patterns, meaning I only had to create high poly bakes of around 25% of the assets, it was way more manageable.
In the end, I only baked a handful of the 25% assets and recycled the baked textures in other assets, which saved texture space and a lot more time.
In Photoshop, I made a mock-up trim sheet of all the patterns I could find. Then, recycling premade ornaments from the pillar, I made a high poly base in Maya and added the color and detail in Substance 3D Painter.
To make tileable textures in Substance 3D Painter, make sure the entire UV space is used. When baking the maps for this trim sheet, I used a simple square plane. When the bake was done, I swapped it for a plane that tiles 3 times to get a better idea of how the textures would tile along larger surfaces.
Here you can see the number of surfaces that are using the two trim sheets I made for the ornaments.
Since so much of the scene ran on trim sheets, I felt a lot of unique grime and edgewear was missing. Edges often felt very artificial. One solution would be to take the ambient occlusion as a mask to add dirt to your scene. However, AO isn’t available in UE5 with Lumen. Another solution would be to vertex paint, but that also isn’t an option in UE5 due to Nanite unless you bake your vertex painting beforehand in a program like Maya or Blender.
To solve this problem, I gave every asset a second UV with shared UVs. Then, in Substance 3D Painter, I made a series of masks that decide where grime and edgewear would appear. For some extra detail, I disabled Nanite on certain assets to add some extra vertex painting.
The ceiling was quite straightforward, yet painstaking. It is actually a near-faithful recreation of the real-life ceiling. To create it, I spent many hours scouring the internet for high-res images, which I then carefully warped onto the UVs of the meshes. This process also involved painting out overlapping cables, chandeliers, and details cut out from the camera. This process made me feel a little bit like a restoration artist!
Some paintings were too long to fit on a single UV set, but I didn’t want to use more textures than necessary. To get around this problem, I cut the texture in half and carefully aligned its UVs underneath each other. I filled the empty spaces using Photoshop’s content-aware fill. This also gave a nice base to fill in any gaps in the original images.
Unfortunately, there were a few paintings I couldn’t find a picture of. Mainly the corners, which are almost always covered by the chandeliers in reference photos.
Even though I was recreating a real-life hallway, I felt I had to add something to the scene for the sake of the composition and focal point. I tried several different things. I felt the floor was a bit too empty compared to the rest, so I tried to add a bit of a narrative at first. One plan was to turn this hallway into a makeshift first-aid post during a war. However, ideas like this added a lot of extra production time to the project, so in the end, I decided to scrap them. If I wanted a good composition, I had to do it with the hallway itself.
In the end, I decided to keep the composition simple. Warm lights inside, cold lights outside, and a door flying open due to strong winds to let the blue light break up the balance of the scene in the middle. This composition required a little extra work and allowed the details of the hallway itself to shine without anything else distracting from it.
Lighting was a lot of trial and error. I wanted a nice balance between colder light coming in from the windows and a warmer light from the candles inside. In the end, I stepped away from realism and added filler lights and effects to push the color composition. Unreal Engine 5 provided beautiful bounce lights, but I couldn’t get them to work with the standard volumetric height fog. Making the fog non-volumetric helped a lot but took away great effects like god rays. To add those back in, I made a simple god ray material and stuck it on a cylinder.
To further push the color contrast, I made the sunlight blue, as well as the god rays. Then in post-processing, I further pushed the blues and reds, which led to the final lighting setup in the environment.
The main challenge of this project was definitely how to compress a large detailed scene into something that is manageable. I had anticipated that a lot of planning would be required to create all the assets for this project. What I had anticipated less, however, was the importance of planning the composition. I neglected this a bit. I didn’t expect it to become as much trouble as it did since it’s a real environment and many beautiful images can be found online. To recreate those and build upon them was more tricky than I expected.
Whenever you start a new project, try to set yourself some goals and constraints. In my experience, it helps surprisingly well with retaining your motivation and excitement throughout the project. The larger goal of ‘completing a project’ will become a less abstract series of smaller goalposts. It also helps with establishing what you’re hoping to learn, adding more meaning to your work.
Another tip I would like to give is don’t be afraid to let your artwork sit for a while if you’re stuck. I let this project sit for a couple of months when I got completely stuck on the composition. When I came back, I was able to look at it with fresh eyes and I had a better idea of how to take this project to completion.
You may find these articles interesting