Yan Ru shared the working process behind the Majestic Ballroom project inspired by the Palace of Versailles and the Paris Opera, showed how Nanite in UE 5.1 was used, and explained the lighting setup.
Hello everyone. I'm Yan Ru from China. I am interested in environment and lighting art. In this article, I will share the process of creating the Majestic Ballroom real-time environment in Unreal Engine 5.
The Majestic Ballroom Project
First, I'd like to briefly describe the project and the results. This is a majestic classical ballroom, set with Nanite and Lumen. While the level is running, the screen can hold hundreds of millions of triangles in real time, and the scene has hundreds of lights in full real time, including shadows. If you are interested, you can download it from my ArtStation.
Before the project started, I added the required references to PureRef. These photographs are from famous places of the world, such as the Palace of Versailles and the Paris Opera. They inspired my composition of the project, the material settings, and the lighting arrangement.
Most of the models in the scene were done by GoldSmooth in 3ds Max. There are about 16,000 objects in the Max file. First, I needed to analyze, then combine these things, and put them into an instance of drawing repeatedly in Unreal Engine. Merging can be done in DCC or Unreal Engine, and I did these in 3ds Max.
The main instance that makes up the scene
I used TurboSmooth to get the high-poly model. Even if you intend to assemble a Nanite scene made up of high-poly models in Unreal Engine 5, you need to take care to limit the number of faces in a single model. Importing models with over 10 million faces in Unreal Engine 5 still caused some crashes. So I limited the number of single-model faces to a maximum of a few million.
Import the static mesh in Unreal Engine.
Nanite in Unreal Engine 5.1
Two-sided material is supported in the new Nanite, which is usually used on foliage, but some of the models in this project also rely on two-sided materials, which allows me to set it up more fully.
Translucent materials are still not supported in 5.1, so I separated all the glass objects into separate grids for further setup.
The final Nanite view of the setup is completed.
Most of the materials in this project come from Quixel Megascans, and you can get the materials you want by setting the parameters of the instance.
The UVs are mostly box-mapped rather than unrolled, which is very fast and gives good results.
I created both day and night lighting for this project. In the day lighting, I wanted to establish soft, warm tones, so I de-emphasized the ambient sky lighting and used artificial lighting for most of the room.
The day lighting procedure:
I recommend adjusting the color of these artificial lights by temperature to avoid incorrect results. The range I use in my scenarios is usually between 3000-4500K, based on real-world parameters.
Next came the night lighting setup. I wanted to achieve a lot of blue moonlight in the room, and after a lot of trying, I managed to accomplish this by setting up 3 directional lights. The temperature is set to 7500K and the color is pale blue, which I love the way it is projected on the floor and the white door.
There is one setting you need to be aware of when working with multiple directional lights: forward shading priority. The primary lighting needs to be determined. And raise its priority to achieve correct lighting shading. In this scene, this option mainly affects the result of volumetric fog.
The night lighting procedure:
The Tyndall effect can be enhanced by increasing the volumetric scattering intensity of the light, which is sometimes just an artistic setup. I've enhanced the moonlight by the window here, although on a real night, based on physics, that's almost never the case.
During the lighting process, too much texture in the view sometimes interferes with my work, so I often switch to detail lighting mode to check, It's a great way to check the color of the lighting and the relationship between light and dark in the scene.
Hardware ray tracing is an expensive extra setup. Even with the thought that I was going to make a running program, I turned it on, which greatly improved the quality of the scene. This setting is necessary for a small environment with many reflection areas.
Comparing Lumen and hardware ray tracing results
Regarding reflection, the performance of screen space reflection within a single shot is adequate and can significantly improve performance, in this case by about 10-15FPS. But as a running environment, it still has a lot of flaws, so I still use the reflection of hardware ray tracing.
Screen space reflection blemishes in some viewing angles
I added some simple UI blueprints and level-switching control blueprints to the project, as well as the first and third-person characters of Unreal Engine, Then I added collisions for all the objects in the scene. Now, the level can be run, which to me is an exciting result.
On the downside, it doesn't perform very well at the framerate due to the ray tracing settings. Only RTX 4090 can achieve over 60FPS at 1080P and runs at 30FPS in 4K. If I continue to spend time on performance optimization, I think it will perform better, and I will try more in this aspect in future work.
In closing, I want to say Unreal Engine is an excellent tool. It may take you a lot of time to get to know it, but that time is never wasted, and it will give you desired and even unexpected results.
Hope this was helpful, thank you for reading.
Yan Ru, 3D Artist
Interview conducted by Theodore McKenzie
You may find these articles interesting