Lead Environment Artist Martin Teichmann has shared an enormous breakdown of the Antique Shop environment, explaining how its myriads of assets were made using Maya, Substance 3D, and RealityCapture and detailing the lighting setup in Unreal Engine 5.
I am excited to share my workflow for creating the antique shop scene in this article. Drawing from my experience working on games like Crysis 3, Batman Arkham Knight, The Last of Us Part 2, and Diablo 4, I sought a change of pace. My last professional job was to create a stylized environment, so I wanted to work on something photorealistic in contrast.
Currently, I live in Santa Ana, a stone's throw from the city of Orange. I find myself surrounded by numerous antique shops in the local city center. These shops, filled with vintage and curious items, offer a great exploration experience. This sparked the inspiration to undertake a similar scene as a side project. With the expansive Quixel Megascans library at my disposal, I saw an ideal opportunity to dive into Unreal Engine 5, get myself familiar with Nanite and Lumen workflows, and use my world-building expertise without the need of creating endless amounts of assets. At least, that was the initial idea.
Antique Shop in Orange, California
Before jumping into specifics, it's crucial to establish a narrative that helps the environment to come alive. I created a backstory for the shop owners and wrote a small story that could serve as the foundation for a first-person adventure game.
Upon reflection, I recognize that I may not have captured all the intended story elements due to asset and time limitations. Layering too many story components, trying to tell only through the environment, especially when the final release is an ArtStation post rather than an interactive game, can be a challenge. Nevertheless, a backstory serves as the glue that binds the environment, influencing worldbuilding decisions and maintaining cohesiveness.
Blockout and References
Gathering references was straightforward, as I was living so close to locations I wanted to rebuild. I collected ideas by exploring different shops. Although photos were not allowed inside these shops, occasionally, I indiscreetly snapped photos with my phone to capture ceiling, shelf, and floor details. Additionally, Google was crucial for collecting reference images, particularly on furniture and object composition.
I made sure to collect images that could answer questions about various aspects of a typical antique shop. These included ideas for the general shop layout, composition and arrangement of items, the shop front, and advertisements. I also focused on lighting moods, seeking inspiration from movie stills to explore different lighting and color schemes.
First Blockout for overall Shop Layout
My initial Blockout felt boring and oversized. Realizing that the antique shops I visited were often sprawling and multi-floored, I made the decision to reduce the scale early on. Every shelf needed detailing, considering the limitations even an asset library like Quixel Megascans has. Texturing and geometry budgets were also considerations. Reduced spaces help maintain a manageable scene, a lesson learned from my past experiences where scenes tend to always grow during development.
To address these challenges, I scale down the shop while creating smaller, distinctive sections. Varied floor heights were introduced to increase visual interest.
It was clear that I would need a great number of assets to achieve the desired level of detail in the scene. Additionally, I wanted to include assets that I made myself rather than solely relying on Quixel assets. Fortunately, soon after I began the initial blockout, RealityScan was launched. This turned out to be exactly what I needed to seamlessly integrate more of my own assets into the scene without the need for extensive prop modeling. The problem of "hand-made" assets alongside scanned ones also had the potential to create inequality in detail and style.
One of my first scans using RealityCapture from my backyard, captured with my iPhone Xs:
I had experimented with photogrammetry in the past but never achieved great results. However, this new app made it remarkably easy to start scanning objects.
For my initial scans, I chose items from my backyard that had patina and age, fitting in well with the Antique Shop theme and adding character to the scene. Ideally, objects working best for photogrammetry are non-reflective and don't have thin elements like hair/fur or wire. It's essential to have accessibility to scan them from all sides and ensure good lighting conditions without casting sharp shadows onto the object.
During my initial tests, I encountered challenges such as the bounce light from the sky or grass nearby interfering with the Base Color of the scans.
A lot of blue bounce light from the sky is present on the scan:
Redone the scan in a more neutral lighting scenario:
Photo setup in the backyard. Not ideal because of the bounce light from the grass and sky:
When I traveled home to visit my parents' house in Germany, I took the opportunity to scan several items I found in the kitchen, basement, and garden. While some didn't turn out as well or had issues that were difficult to identify on my iPhone screen, a good number of scans came out great, and I added them to the Antique Shop scene. This addition gave the scene, especially for me, a very personal touch.
Some scans created using RealityCapture:
Substance 3D Sampler introduced its photogrammetry feature shortly after RealityCapture released their app. Curious about the differences, I dug into using this tool as well. To ensure the highest quality possible with Substance 3D Sampler, I used my Sony Alpha camera and a more elaborate setup.
Photogrammetry setup for Substance 3D Sampler. Three LED Lights evenly light the subject. I am using cross-polarization to remove the specular highlights from the lights. (Pole Filter on Camera and pole filter foil applied to the LED lights):
While I won't dig too deeply into setting up the photogrammetry process here, I'd like to point out some great YouTube videos on the subject:
RealityCapture produces dense and often noisy meshes. In Maya, I removed floating pieces and unwanted background elements. Maya 2024's new Auto Retopologize feature saved me from the time-consuming process of manual retopology.
Unwrapping the retopologized mesh is much easier than dealing with the irregular triangulated geometry. When retopology was unsuitable due to crucial detail reduction or blurring of important details, I used a low-resolution mesh to unwrap the UVs. Using Transfer Attributes, I then copied the UVs to the high-resolution mesh:
Substance 3D Painter doesn't offer baking for Base Color. To apply the scanned texture onto the retopologized and unwrapped mesh, I used Maya's Transfer Maps tool:
To achieve the best results, I saved the original scanned texture again as a PNG, reimported it, and in Hypershade, I adjusted the texture's Filter Type from "Quadratic" to "Off":
Having the retopologized, unwrapped mesh and the baked Color Map ready, I proceeded to bring everything together in Substance 3D Painter. This step is straightforward, baking the Ambient Occlusion Map, Normal Map, etc. The Color Map that was baked earlier served as the foundation for the Base Color and Roughness. I took care of some small scanning imperfections and made sure that the object's Roughness added to its photorealistic scanned look.
Some additional wear and tear is easy to add with a simple color fill layer and a smart mask:
In Unreal Engine, I build a master material for my scanned and hand-created assets. To ensure enough variations between the same assets, I integrated specific material effects. This included a color hue shift feature and a world space rust effect.
Color hue shift setup
Hue Shift effect:
World space driven rust effect:
Overall I scanned and implemented a total of 29 objects using RealityCapture and Substance 3D Sampler.
Additional assets modeled by hand in Maya and textured in Substance 3D Painter:
Drawing from my references, these shops often are somewhat messy and disorganized at first glance. However, there's a method to the clutter – organized chaos. In my scene, I incorporated a shelf dedicated to old electronic devices and a corner filled with furniture and chairs. Next to the window, I positioned a collection of figurines and statues to showcase valuable items to pedestrians passing by the display windows.
I loved the color from the flowers and foliage. Especially in the lighting next to the entrance, these worked very well.
As I continued working on the scene, I began implementing additional guidelines for the scene. For instance, I wanted to eliminate straight lines and introduce subtle detailing to the silhouette, even if it's minimal, it helps to avoid the typical CG or game art look.
I aimed to create a store that realistically captured a sense of clutter. This involved not only densely placing items on the shelves and filling every available corner, but also incorporating details like price tags, power outlets, light switches, dirt in the corners, and even fallen leaves under the foliage. Using small imperfections, dirt, and damage was essential to avoid straight lines and to ground objects within the scene
Small cluttered objects, outlets, cables, and light switches helped to enhance the overall authenticity of the shop.
I integrated dirt and small details along edges to break up harsh lines and ground the objects. Small items were deliberately clustered alongside larger ones. A coffee mug stain on the desk adds to the scene's authenticity as well.
Closeup shots of Item arrangements inside the Antique Shop. Overall the scene has close to 4000 actors:
Unreal's Virtual Textures came to the rescue, enabling me to add a vast amount of high-resolution textures for all the props within the scene. When it came to the unique building geometry, I used vertex painting to add detailed surfaces to walls and the floor. An important note here is that I had to switch back from Nanite to standard geometry to utilize Unreal's Vertex paint tool.
For lighting, I'm using the Ultra Dynamic Sky system. It's a powerful Blueprint collection that manages the sky, atmospheres, Directional lights, and Sky lights. This tool is fantastic for quickly altering the time of day, clouds, or the weather in general.
The system as a whole lets me adjust the Skylight, Directional Sunlight, atmospherics, and clouds altogether, while also allowing for random shifts in weather and lighting. One notable feature is the cloud shadows, which I enabled and fine-tuned to create a subtle change in lighting over time.
In my scene, both Lumen and ray tracing are turned on. I turned up the GI and increased the indirect lighting from the directional sunlight to a value of "three" instead of the default "one". This heightened the overall bounce light intensity and gave the scene a slightly dreamy look.
Sunlight, cloudy, and rainy light conditions in the early stage of this scene:
In the Post-Process Volume, I applied some color grading, mainly enhancing overall contrast slightly and infusing a touch of green into the shadows to make the scene feel cooler. Striving for a photorealistic look, I chose to add camera effects that would simulate the scene's captured through a camera lens.
The most successful addition was the Film Grain effect. I chose a high value for the overall Film Grain, minimizing the Highlights value and increasing the Shadows value to replicate the characteristic photo noise in dimly lit scenes. For a finishing touch, I incorporated a subtle fisheye effect into the scene.
To add this effect I am using a console command: r.Upscale.Panini.D 0.1
This effect also helped to reduce the straight lines that I wanted to avoid.
Strong Fisheye effect using Upscale command set to a high value of 10: r.Upscale.Panini.D 10
Throughout the process of creating this scene, getting the lighting right, adding Post Effects, and setting up the camera correctly required several attempts. The references I gathered earlier turned out to be extremely useful for achieving a realistic appearance. Watching movies with similar scenes also provided valuable insights and inspiration.
In conclusion, I'm happy with how the scene has turned out and the valuable insights I've gained throughout its development. I initially began the project when the first Unreal Engine 5 Beta was released, but it remained unfinished for quite some time. However, at the start of this year, I re-engaged with the scene and dedicated three months to bringing it to a completed state.
Exploring photogrammetry was not only enlightening but also enjoyable as I searched for items to scan and integrate into the scene.
However, there are aspects I would like to refine and potentially revisit. The backstory I wanted to tell isn't as visible within the environment as I had anticipated. The street is also a weak point; its lack of detail doesn't match the quality of the shop's interior, leading to my final realization. Given my limited time and the solo nature of this project, maintaining the right scope is essential. Given that the goal was to create a photorealistic environment with dozens of unique and detailed assets, maintaining consistent quality and detail across an expansive scene is simply unrealistic. Prioritizing strategically and using time where visibility matters most are essential.