Lea Maletić showed us the workflow behind her Hanging Gardens project, explaining how lifelike foliage and shadows were created and how every element of the scene was harmonized with each other using SpeedTree, Blender, Substance 3D Painter, and Unity.
Introduction
Hi everyone, my name is Lea Maletić. I'm an Environment and Prop Artist from Serbia. My journey into the design world began at the Bogdan Suput School of Design, where I built my visual foundation and 2D skills. Continuing my studies at the Faculty of Technical Sciences in Novi Sad, I attended a mandatory 3D course, where I discovered my passion for 3D. I was instantly drawn to the creation of environments and game art. I turned to online resources, primarily YouTube and various articles, to expand my knowledge beyond the classroom. Simultaneously, I worked on mobile games as a 3D Artist and Game Designer during my studies.
While searching for concepts for my bachelor project, I found a beautiful illustration of Hanging Gardens by Hynsu Cha. I felt immensely inspired, so I decided to make it in 3D from scratch since it perfectly fitted the style I was looking for.
Planning
During the first hour, I visually mapped all the elements I needed to model for the scene since there was a lot of repetition. I also gathered surface references. I believe that the importance of having references is already well established.
Original Concept & Marked Elements
I started by blocking the scene in Unity using the basic primitives and some simple models. I used different colors for models to categorize the scene in three plans visually. In this initial stage, I expanded the scene to include additional elements, constructing a blockout of the entire fortress. While this step isn't strictly necessary, it provides a clearer sense of the space and its potential for expansion. The color-coded planning also helps organize and visualize the scene more effectively. A quick light setup further enhances this base, giving me a solid foundation for developing the full environment.
Modeling
In the next phase of the scene development, I replaced the initial blockout with low poly models. For better optimization and faster production, I categorized the scene elements into three distinct groups based on their expected distance from the player: Foreground, the first plan, which included high to low poly models for close-up details; Midground, the second plan, with low poly models; Background, the third plan, with painted background planes for distant scenery, including foliage, background, and distant buildings. I created all models using Blender while keeping the polygon count in the 500-3000 poly range per element. I found good videos covering architecture modeling tips on the hbitproject YouTube channel.
At this stage, I had a clear preview of what the final scene would look like. I began by selecting the models designated for the Foreground (the first plan) and used them as the foundation for detailed sculpting.
I continued with the sculpting process in Blender. For better sculpting results, I combined Remesh and Dyntopo tools. Since Dyntopo subdivides while you're sculpting, it prevents a sharp pixelated look. Meanwhile, Remesh was used to balance the overall mesh topology. Basic stone, wood, leaf, etc references were of great use for the sculpting process. Elements are reused for multiple assets. For example, groups of separate stone tiles are combined into stairs following the rule of creating seven different rows to avoid visible repetition. They are also used for stone walls and deformed for floor variation.
Sculpted Models
Since the scene is full of architectural elements, I naturally used the trim sheets technique for horizontal architecture elements, which gives good reusability and optimization. I filled square projections with trim rectangles, sculpted patterns using masks that I painted as alpha texture in Photoshop, and sculpted additional damages.
Foliage
For the first plan vegetation, I created trees using SpeedTree, Real Ivy, and Blender for smaller plants. SpeedTree proved to be an effective tool for generating and customizing trees, so I used it to create some basic trees, fine-tune parameters, and perform manual adjustments to achieve the desired volume and shape. I created a Diffuse Map of a leaf branch texture for leaves with a decreased number of details. It is important to keep in mind how it will look implemented on many intersecting leave planes, leaving less room for minor details and more to think of the main shape and leave spacing. For a fast test, I created a couple of different textures, keeping an eye on positive/negative space proportions. I also try to keep values simple and subtle to avoid noisy looks.
The texture of sculpted and baked leaves and flowers is used to create smaller plants and as a leaf texture for Real Ivy. This software speeds up the process since it generates ivy and climbing plants using the colliders in your scene as a base on which to grow, climb, and adapt, which is a real time-saver. I further edited ivy with cutting and drawing tools.
For the second plan foliage, I used the workflow that Romain Durand covered in his article, but completed it in Blender. To break the sphere shape, I added a few SpeedTree leaf groups for some pop-ups. You can find some great plant tips included in workflow in Marie Lazar's article.
For the third plan foliage, which is positioned out of reach for the player, I used spheres and rounded planes with foliage textures applied. I focused on drawing a texture that would resemble a distant foliage look from concept illustration.
Texturing
After sculpting the models, I decimated them, UV unwrapped them in Blender, and imported both low and high poly versions into Substance 3D Painter for baking. The texturing workflow for most models is similar: I did a base with baked light, Ambient Occlusion, and gradients. Next, I applied a layer of metal edge wear, using masks to paint, enhance, or erase the effect on specific areas. After that, I added several hand-painted layers to introduce color variations and polish. Depending on the material type, I use a dirt generator and reduced built-in smart materials as a base to refine the look.
For certain models, I focused primarily on using a base color or material, Ambient Occlusion, and hand-painted details.
Materials
For materials designed for wide surfaces, I used a consistent workflow, including Blender and Substance 3D Painter. The process involved several key steps: I started by creating a low poly base model, which was then sculpted to add detail. I arrayed it into a 2x2 tile pattern and projected it on a plane in Substance 3D Painter. By positioning the plane precisely at the center of the 2x2 array of models, we are making sure that we get a seamless texture. The most challenging aspect of this process is avoiding noticeable repeating elements. To achieve a natural look, it's important to keep the elements as neutral as possible, making sure that no unique features stand out.
Finished assets:
Scene Polish
After texturing all models and assembling them on their positions on the scene, it's time for polishing. Analyzing the natural environment is a big part of it. I was paying closer attention to all the little imperfections on your small everyday walks, such as leaves that crumble ons on walls, moles the side of the roads, wet spot, and discolorations. To get those effects while not overdoing them in a realistic manner, I generously used Decals. I added Decal shadows underneath the architectural elements to dramatize and achieve a more stylized look.
In my project, I used the Universal Render Pipeline (URP). Besides the standard skybox and main light, I added a few additional lights to highlight specific areas and align with the concept art, such as wall color lights beneath the columns.
To achieve a better mood and height effect, I added a darker dynamic vertical fog shader and basic Unity fog. Although we’ve found that picking fog color from the sky is the most effective approach, it needed to be slightly greenish in this specific case.
I painted a simple background that resembles the background of the concept. Final mood touches are added during post-processing, where I added some Bloom to accentuate the light ray reflections on the roof and succulent planter, greenish vignette, and subtle but effective Lift Gamma Gain changes to get more cinematic effect.
I created a vertex displacement shader for the wind effect and used a particle system for falling leaves. The main key points in the leaf particle system are using noise and Orbital Velocity over Lifetime to add a natural feel.
Conclusion
I aimed to capture the original concept's distinctive mood for this piece, where element cohesion was crucial. The goal was to ensure that every component harmonized with the overall design, enhancing the unique atmosphere envisioned in the concept. The biggest challenge of this project was replicating the foliage as close as possible to the original concept without adding too much geometry or using complex shaders.