Alena Tikhomirova and Boris Otkhmezuri shared a detailed breakdown of their Neon Streetside Diner project, explaining how they filled the scene to make it look detailed without overloading and visualized neon lights and rainwater in Maya, Unreal Engine 5, and Substance 3D Painter.
Introduction
Hello everyone! We, Alena Tikhomirova and Boris Otkhmezuri, created the Neon City scene together, so we'll introduce ourselves separately.
My name is Alena Tikhomirova, and I have loved playing computer games since childhood. At some point, when I was a teenager, I started wondering how they were made and whether it was possible to learn how to create them. However, I didn't take this idea seriously at the time. When I entered the university to study graphic design, we had classes on 3D modeling in 3ds Max. At that moment, I remembered my dreams again.
Over time, I switched to Autodesk Maya, continuing to study 3D graphics on my own. It was a rather lonely journey, and I wanted to be surrounded by like-minded people and feel supported, so I decided to join the online school – Retry. Since then, I have greatly improved my modeling and texturing skills. I even created a fairly successful piece for my portfolio.
Within the school, we have raids, which are production simulators. A team of students with different skills design and create a scene. Everyone has their own role here: modelers, leads, and even an art director. I participated in one of the first raids as a 3D Modeler and Texture Artist. It was there that I met Boris, with whom I created this scene. I am currently involved in an unannounced project with an indie team as a 3D and Texture Artist. It will be a platformer game set in a post-apocalyptic setting. The game's demo should be available on Steam soon.
Hi everyone! My name is Boris Otkhmezuri. At university, I studied CAD (Computer-Aided Design) with an emphasis on programming, where I also took a short, one-month course in 3D modeling. This subject fascinated me, and I decided to delve deeper into this field.
Since many of my family members are working in the construction industry in one way or another, I chose a master's program that combines my love for digital technology with the construction industry – Architectural Visualization. That's where I first got acquainted with 3D modeling, working in 3Ds Max, and first trying VR technologies. At that time, it was Oculus Rift DK 2 and the first version of Unreal Engine 4. I decided to combine my knowledge in programming, modeling for architectural visualization, and academic pursuits, and I entered a Ph.D. program. My research topic was The Design of Virtual Reality Applications for Psychological Interventions.
Since architectural visualization usually involves creating pre-rendered static images rather than real-time rendering, I began independently studying the process of creating game-ready 3D assets, as well as slowly switching from 3ds Max to Autodesk Maya. Initially, I sought out and studied information on my own, which was sufficient for my needs during the Ph.D. However, after graduation, I wanted to dive deeper into the process of creating game-ready 3D assets and environments. While searching for training, I found the Retry school, where I met Alena. Currently, I am working in academia. However, I want to try myself in the industry and work hard to prepare my portfolio.
Inspiration & References
During our studies at Retry, we began working on creating a layered shader for Unreal Engine 5 under the mentorship of Anton Ageev last year. Once we finished it, Anton suggested testing it in a real project. This sparked the idea to collaborate and create a scene. At first, it was supposed to be a diorama, marking our first experience in environment creation. Initially, we were choosing between indoor and outdoor settings. After deciding on an outdoor location, we started thinking about the style. We both wanted to work on a cyberpunk-themed environment, so we quickly agreed on the theme. We also drew inspiration from the game Stray, primarily for its atmosphere and lighting. While searching for references, we considered several options and eventually settled on our final choice. However, as we started working on the project, it became clear that we would create a render for a static camera shot rather than a diorama. However, the idea of a diorama hasn't left us, and we might continue working in that direction.
The reference search was carried out in two stages. In the first stage, we searched for the main reference on platforms like Pinterest, Google Photos, and Yandex Images, and finally found it on Pinterest. We were drawn to the atmosphere and the bright neon lights. Initially, we thought the chosen reference had an author, but upon closer inspection, we realized it was an AI-generated image.
After selecting the main reference, we began searching for more detailed references for the interior design and props for the shop. We focused on Asian street food. Friends also helped by finding references and taking photographs of real Asian food products in the stores, which we later used as guides for creating models and textures.
Our additional references on the lighting, atmosphere, and content of the store:
As the main reference did not accurately depict the shapes of the objects, we had to search for similar photos of items to model them correctly.
Collaboration
After the preparation phase, we faced the question of how to divide the responsibilities for working on the scene. We were both interested in working in all roles (3D Artist, Texture Artist, Level Artist, Lighting Artist), so we divided the work by the shop's floors. Boris took the first floor with all its contents, while Alena took the second floor and handled the full modeling of the building.
We chose Unreal Engine 5 because we both wanted to try working with this engine as it is one of the industry standards. For ease of collaboration and to keep track of all stages, we used a scheme developed by Retry in Figma for raids, and for working in the engine, we used Git and Sourcetree. These tools are very useful when you are working together or as a team on a single project. In Figma, we had a shared reference pack, all important project links, and a table to track the progress of all stages. When you pull in Sourcetree, the scene in Unreal Engine 5 on your computer automatically updates, and you receive all the meshes and materials your partner worked on, already placed in their proper locations. We also had almost weekly calls on Discord to discuss our work and what needed to be done next.
The way it looks in Sourcetree:
The way it looks in Figma:
Composition & Blockout
Since we were initially planning to create a diorama, we modeled the scene's blockout by eye and even worked on the back side of the shop. To make the building look relatively realistic rather than toy-like, it needed to be created at full scale. Therefore, we used mannequins to determine whether the dimensions in the scene were accurate compared to them.
First Blockout in Maya:
But later, following Anton Ageev's advice, we decided to create the scene for a specific camera shot and had to abandon the back side of the shop. The main challenge was setting up the camera so that our blockout would match the reference in terms of size and mesh positioning. We couldn't get the camera settings right in Maya. We found a way to do this using the program called fSpy and the corresponding Blender add-on. While there's an option to work with this program in Maya, the camera did not export correctly, which caused our blockout not to resemble the reference.
Screenshot from fSpy:
We decided to continue the main blocking stage in Blender. Once we established the basic shapes and were confident in the correct dimensions, we moved back to Maya for easier and faster work as we both used to work there. During the process of refining the draft and filling the scene with meshes, we periodically transferred the project back to Blender to check if everything matched the reference. Working with fSpy greatly simplified the modeling process, and from that point on, the work progressed more quickly.
The camera set up through fSpy, and the reference:
Modeling
The starting point for the entire scene was the main shop building. We began with that. Since we were creating a static render for a specific shot, we decided to forego modular construction and made it a single mesh. For further vertex paint texturing in the engine, Alena sliced it into roughly equal 50 cm sections using the knife tool in Maya. To do this, she created a 1m x 1m cube, cut it into equal halves, and used it as a reference.
Next, we began modeling smaller assets around the house, such as signs, the pedestrian walkway, and the asphalt road surrounding the shop. Inside the shop, we first created the larger assets and then added smaller details. By the end of the work on the draft scene, it looked like this (screenshot from Blender):
Overall, this was the easiest part of working on the scene, as we used a standard set of tools to model all the assets in Maya and placed them according to the reference.
Filling the Space with Props
When creating any spaces, the question of how to fill them always arises. You can create a beautiful space, but what brings it to life and makes it interesting and eye-catching are the details and the filling. For example, you can have an empty table, but as soon as you fill it with simple shapes and primitives, the space immediately becomes more intriguing, making you want to explore what's on that table (the work by Boris Otkhmezuri at Retry School):
We used the same approach here. The most important thing is not to overdo it with details and leave some open space so the eye can rest. During the blocking/drafting stage, the filling of the corner shop began with placing large objects (such as the slush machine, juicer, chairs, etc.), and then Boris moved on to smaller items like dishes and shelf contents. To bring the scene to life, we added a little chaos and varied the rhythm of object placement. For example, someone might have walked by and knocked a chair or placed a bottle or spice jar back on the shelf unevenly (see the image below). When selecting props, we primarily focused on the references of Asian street food shops. Most of the props were created from scratch, but some were taken from Quixel Megascans, such as the oranges.
The most interesting props to work on were probably the slush machine, the chair cover, and the shop rooftop. While working with these objects, Boris was introduced to fluid and cloth simulation for the first time. He conducted all these simulations in Maya. For creating the chair cover, he primarily focused on the visual perception from our main reference. The cover looks heavy and not very smooth, so he tried to choose appropriate parameters for the material simulation. He applied the same approach to the fluid simulation. The first simulation was done with a glass; he wanted to convey the feeling of a tap being open too wide, causing the liquid to splash out of the glass. Then, he created three other simulations for the slush containers so that they all differed slightly.
Cloth sim for the rooftop:
Retopology & Unwrapping
For creating the scene, we chose a mid poly modeling pipeline to avoid retopology and baking for props, which allowed to speed up our work. All the UV mapping was done in Maya. For the house and all the surrounding assets, we created 2K textures. Since we used a layered shader on the house, we made two UV maps. One UV map was unique for using vertex paint in Unreal Engine 5 with a texel density of 10.24.
An example of a uniquely unwrapped prop in Maya:
UV:
Texturing
All objects were divided into three material types: decals, glass objects, and standard materials. Texturing unique objects was done using Substance 3D Painter. While texturing in Painter, the viewport was set to represent the Unreal Engine 5 tone mapping to match the colors with the engine while texturing. To do this, a few parameters in Substance 3D Painter were adjusted. Firstly, in the display camera settings, the Active Post Effects were turned on, and the Log Function was selected. Then, the Unreal Engine 5 color profile was downloaded and attached to a color profile section. You can find the ACES LUT color profile for Substance 3D Painter here.
Camera settings in Substance 3D Painter:
Master materials were created in Unreal Engine 5 for each type of object, as well as a separate multilayer material for vertex painting the asphalt and the main building facade.
For most of the props, we made a fairly flexible material that allowed us to achieve various visual results, which simplified the prop texturing process. For example, using a single set of textures, we could create variable surfaces by giving them different shades by adding/changing brightness, contrast, tint, and saturation in the base color.
Master material for props:
Base Color adjustment:
The shader also allowed for manipulation of roughness by controlling its minimum and maximum values. If we wanted to add additional changes to the roughness or change it entirely without going back to Substance 3D Painter for unique assets, the material allowed for that. An additional branch was provided in the shader for imperfections. This allowed us to blend other maps into the roughness channel or completely change them by adjusting the blend value.
Roughness adjustment:
Imperfections adjustment:
The other channel we could interact with was the normal. Here, we could adjust its intensity.
Normal adjustment:
Next, we had an emission, where we could attach our Emission Maps and control their intensity.
Emission adjustment:
Last but not least, the tool we added to the shader was UV adjustments. For ease of use, a material function was created. It included five scalar parameters that allowed for a) rotation, b) separate tiling by U and V, and c) making an offset by U and V.
Another master material we created was intended for glass surfaces and had a fairly small set of parameters but enough for the correct display of glass surfaces. It included Color, Roughness, Opacity, and Index of Refraction (IOR).
The next technique we tried in our work is vertex paint. We applied it to the main facade of the building and the asphalt. For this purpose, we created a layered shader that can paint puddles. The asphalt materials themselves were taken from Quixel Megascans. Two materials were chosen: one standard asphalt with small cracks and the other asphalt with debris.
When you import materials from Quixel into Unreal Engine 5 using the built-in Quixel Bridge, you can set up a layered material based on previously acquired ones. However, when creating such material, you may encounter an issue that hasn't yet been fixed in Unreal 5.3. To work around this error, you need to select one of the materials and create a blend material based solely on it. Then, you can connect the remaining materials to the newly created blend material.
The advantage of creating such a material is the ability to create wet surfaces and puddles, as this functionality is already built-in. By controlling the strength of the Vertex Paint brush, you can create either a wet surface or a puddle. However, there are also drawbacks as if you want to use puddles, you can only mix two materials in this setup. This is because the puddles use the blue channel of the vertex paint instead of a third material.
Final Scene Setup & Composition
We set up the main camera with the composition for the render at the beginning to monitor the scene's appearance and its resemblance to the reference. As we mentioned earlier, fSpy helped with this during the blocking stage, but it didn't transfer the camera to Unreal Engine 5. So, to move the camera into Unreal, we placed a small cube in the 3D scene in Blender and then transferred it to UE5. This allowed us to know the exact position of the camera, but we still had to adjust the camera settings (such as Field of View) through experimentation. Although we couldn't perfectly match the reference, the final shot is very close. All other shots for rendering were composed at the end, with the composition and angles adjusted as needed.
The character model has been chosen to resemble the reference. We took it from the Posed Humans Winter Pack 1 from Unreal Marketplace. Among other assets in the main shot, you can spot an Easter egg hinting at Boris Otkhmezuri's future work.
Since we relied on the reference, our independent compositional choices were mainly in small details, such as trash on the asphalt and tree leaves scattered across the surface, using Foliage Mode. We intended these elements to guide the viewer's eye toward the main focus – the shop.
Lighting & Rendering
While working on the textures, we also focused on the neon signs and lighting in the scene. The first thing we did was set up the night lighting. Instead of using the standard SkyLight, we added a BP_Sky_Sphere to the scene, which allows for the creation of realistic skies and lighting. To use this setup, you need to enable the engine's content display and drag the BP_Sky_Sphere into the scene.
Our scene looks like this, with just the night sky lighting and the emissive materials applied to some assets:
After that, we added the base lighting for the environment using point and area light sources. Since the shop building is located in a city, it's illuminated from different angles by other signs, streetlights, and various street lighting sources. We also added lighting inside the shop. At this stage, in addition to following the reference, we aimed to use the lighting to separate the foreground from the background, highlight the building itself so it wouldn't look flat, and ensure that the lighting emphasized the metallic parts of the signs.
Simply connecting the emissive wasn't enough to work with the emissive materials on the street signs. How do such signs work in real life? Typically, a colored film is applied to a plastic box, and all the text is the base color of the plastic, illuminated from within by lights. Therefore, all the text on the sign should be brighter. So, on the emissive texture, we only kept the text, while the sign's background colour used the Base Color. However, this initially caused the signs to glow differently than we wanted. After experimenting with the emissive colors, our final maps for the various signs looked like this:
But it still wasn't the effect we wanted. To achieve the glowing effect in the shot, we added RectLights to the signs and adjusted the Fog Density in Exponential Height Fog. This made the lighting interact beautifully with the scene, enhancing the atmosphere.
The scene was still quite dark, with many black areas, so we added more ambient lighting. We also illuminated the asphalt in the foreground to bring out more details.
The lighting work was nearly complete. To add depth and atmosphere to the image, we introduced fog behind the shop and in the foreground in front of the camera. Unreal Engine 5 has its own local Height Fog, but it didn't suit our needs. After searching on YouTube, we found a solution: a sphere mesh with dynamic textures.
This method allows for convenient adjustments of the albedo color, wind speed for a realistic effect, as well as the transparency and height of the gradient.
At the final stage, we moved on to post-processing and additional visual effects. To further enhance the atmosphere in the shot, we decided to add dust particles. To do this, we used the Niagara System inside Unreal Engine 5. It is quite a powerful tool for creating different types of particle systems. In order to achieve the effect we were looking for, we created a custom dust particle material and configured the emitter accordingly.
To add depth to the foreground, we also simulated an effect similar to God Rays using the LightBeam asset, which you can also find in the engine's content. This asset is essentially a cone with a semi-transparent, customizable material applied to it. With this material, you can adjust the length, transparency, and density of the rays or even change their appearance.
In the end, we added some post-processing effects. We set up the depth of field to blur the background, added some bloom to further highlight the signs, and experimented with the exposure settings to darken and lighten some areas of the scene.
PostProcessVolume setting:
For rendering, we used the Movie Render Queue in Unreal Engine 5 and utilized its features like Ray Tracing and Lumen to enhance the visual quality. In order to render out the image in the same color space, which is ACES in Unreal Engine 5, we created a color configuration file to transform the linear space to ACES. Then, we added a little bit of antialiasing to smooth out the light reflection and highlights. Moreover, we added some render and engine warm-up frames to give some time for the particles to emit before capturing the image. No post-production was applied to the final render.
Render Queue settings:
Conclusion
The entire process of creating this project, with breaks, took us about four months. The primary challenges we faced involved ensuring a well-balanced composition, achieving the desired realism, and tackling the technical aspects of the project, especially since this was our first project in Unreal Engine 5.
During this experience, we learned several valuable lessons. One key takeaway is the importance of proper planning and being willing to make changes both to your assets or ideas. It's important not to spend too much time on elements that won't be prominently visible in the frame, but also not to do them hastily. Continuously analyzing and refining your work is essential to ensure it aligns with your vision.
For beginners like us, we advise being patient and persistent. Creating interesting, seemingly simple works of art takes time and effort, so don't be discouraged by setbacks.
Seek advice from more experienced people and ask for feedback at every stage of your project. This will help you avoid common mistakes and significantly speed up your progress. Experienced colleagues or mentors can offer new ideas that you might not have considered. Additionally, their insights can help you improve your skills and broaden your perspective.
A bit of humor: the main video for those who are trying to model in Blender after Maya: