3D Artist Manoj R has shared an extensive breakdown of the Medieval Food Stall Environment, talked about Runtime Virtual Texturing, and showed some useful Unreal Engine techniques for setting up realistic water.
Hi, I am Manoj from Bengaluru, India and I have been a 3D Artist for over 3 years now with my focus being on modeling, texturing, and rendering props. I am currently moving toward being an Environment Artist as I find the idea of creating game spaces a lot of fun.
Countless hours on games like Skyrim and The Witcher 3 certainly had a huge pull towards me joining this line of work and the thought of having to contribute to a game made me happy. My journey with 3D started in Arena Animation, however, I learned almost all of my skills on the internet through tutorials on YouTube and other forums. Mentors and leads at work certainly had a huge impact in changing my workflow from a student level to an Industry standard. Browsing through ArtStation, and watching talented artists and their workflows always added a new degree of knowledge to my arsenal.
I have worked on a few amazing AAA games like FIFA 22 and others which I can't disclose for now; before that, I have also modeled a ton of product designs for smartphones. I have worked on a bunch of personal projects like Au Rafale, Chevrolet Camaro, etc.
Initially, my goal was a simple gathering of props I had already made which felt like a big deal to me, as I did not know how to use Unreal Engine 4 but as I started learning, more ideas popped into my head and which led me to make a bigger environment.
Having had no actual concept art, I only had a picture in my mind to bring to life, based on which I started looking for references.
First I collected images from Assassins Creed Valhalla to get a tone of the roads, foliage, and rock placements, then I went on a hike to gather some real-life references with the final lighting in mind as well as the set dressing. I learned the basics of Gaea to create a version of the Dragon Lake from Greece and figured it could use a merchant boat carrying fresh goods. Reference collection was important as I added minute details which individually go unnoticed but add an overall effect.
Modeling Workflow and Tricks
With modeling and UVs I wanted to have a low poly and texture budget while maintaining the most quality so I had to use a few tricks.
1. I used very simple hard cornered geometry and let the normals take care of the details I sculpted.
2. I only mapped the unique parts of a model into the 1st UV set and duplicated the rest into a different UV set in the same place(as shown in the example below) also making sure it wouldn't look repetitive.
3. My favorite asset of all is the Modular Box which has a variety of planks set up on each face which makes it easy to populate an area. It has undergone the same UV treatment so it's not very expensive.
The boat was another favorite of mine as it combined a bunch of references I collected which required more wood sculpting than the rest. The buoyancy actor in UE4 helped with the flotation of the boat blueprint which contained paddles, boxes, wooden seats, etc. within it. I used a simple method with only two brushes to sculpt all the wood in the scene. Here is a rough demo of it but in reality, I spent a lot more time sculpting.
For creating all the props and hero assets, I mainly used Maya, ZBrush, Substance 3D Painter and Marvelous Designer for cloth. Creating cloth wasn't much of a challenge as MD did most of the work. After that, I simulated the cloth with the wind in UE4.
Making the cloth pieces in the scene react to random wind speeds and direction was a breeze, thanks to Unreal handy tools. Starting with importing the asset with a sufficiently dense poly count as a Skeletal Mesh and adding collision to the areas I don't want to flutter in the wind to the physics asset, I created clothing data and painted the areas I want the wind to have an effect on. Areas painted in white are affected and pinks stay static.
The randomized wind was achieved by defining individual functions for Strength, Speed, and Direction and connecting it with the Directional Wind Actor in UE4. Later I brought them into the level blueprint to start at PlayEvent. All cloth pieces in the scene down to the little flag at the front of the boat has this effect.
Foliage and Asset Optimization
As an Environment Artist, apart from creating assets, you can also use anything at your disposal to create beautiful scenes. I couldn’t be luckier that Epic Games released the Black Alder Trees pack when I was working on this scene. Using a ton of assets from Quixel Bridge also meant that I had to carefully optimize the scene. Altering 4+ LODs for each of them while judging their importance in the level, changing their lightmap densities, tweaking their screen size, and reducing their cull distances just enough would give me a good balance between performance and quality. I reduced the LODs exponentially except for a few hero trees I had placed near the game area.
Using Landscape Grass-type along with a very complex Landscape Material by Unreal Sensei, I made texturing a huge landscape a breeze. This also meant I could use splat maps from Gaea for texturing snow, grass, seabed, etc. Even though I had textured the asset fully in Substance 3D Painter, I created a Props Master material to gain full control of textures inside of UE4 in case I needed Emissive, Opacity, Displacement, etc.
Here is a breakdown of how I have textured the boat and its canopy. I have used multiple layers of color variation for wood that has been created procedurally. All other assets have been textured the same way.
I have also used a lot of decals from Quixel bridge to add debris and leaves around the playable area. Runtime Virtual Textures were used from the landscape to blend assets more into the ground.
Runtime Virtual Texturing
I have used RVT in this scene to blend the Megascans assets/my own assets into the landscape. Starting with using the RVT plugin in Unreal, I created 2 materials; one for the Height Map to get world height data from the landscape and another for the textures of the landscape(these can be changed inside the materials).
To capture the data, 2 RVT volumes were used and bounded to the extent of the landscape. After hooking up the RVT output to the Landscape material output in the Landscape material graph, I have changed the Normals to World Space from Tangent Space as Normals as usually best imported in Unreal in Tangent Space. Masking out only the Z-axis using World Position data will later help define the amount of blending required between the asset and landscape. As the virtual textures are captured they can be added to our landscape in the details panel.
I have also addressed the issue of texture stretching and defined parameters to be used to control the amount of blend and the height it needs to start from in the Material Instance for ease of use. Finally, I created a module out of it to be used with any material in Unreal by just plugging it into the output of said Material. As this is a pretty complex to set up I have only discussed the basics. I have followed this tutorial from Unreal Sensei, which explains the entire process of creating and implementing RVTs and I highly suggest learning the process and using it to add more realism to your scenes as it saves a lot of time.
Scene Composition and Set Dressing
When it comes to my approach to the final scene composition, I wanted to accentuate the stall, boat, and pathway while overlooking the lake and the mountains. The Landscape Grass-type helped in set dressing not only the grass but trees, flowers, and rocks as well which gave me a foundation to start set dressing.
I placed a bunch of boulders, columns, bushes, and tree stumps to break the scene’s silhouette while using twigs, flat stones, and fallen leaves decals to give the road and pathway a bit more life. I placed dried glass closer to the road, fresh ones inside, and a mixture of both in the middle of the road to provide realism. I used the dead broom brush to scatter some hay near the stall. Bigger rock formations were used to break the lake view from looking flat along with smaller stones as beach rocks. I added broken branches and rocks to step on in the pathway while peppering it with debris to make it believable. Flowers that had complementing colors from each other and the rest of the environment were used so the scene wouldn't look monotone. I used the generic clouds that come with the SkySphereBlueprint as it was what I was looking for.
I created falling leaves and fireflies in the night using the UE4 Niagara particle system to add a bit of movement to the scene.
I used 2 sets of blueprints for morning and night to show that the food was almost sold out by night time.
Unreal’s Water system made it easy to create and customize a lake and its properties. I spent quite a bit of time with the water material to get the visuals along with the wave height and frequency right; this was because the rocking of the boat needed to be just right for how much it weighed and mimic a typical light breezy lake. I did change the water settings at night to get the right look but did not factor in the wave height due to a full moon present because the effects are negligible.
UE4’s new Water System comes with a lot of new features of which Buoyancy is one. Making the Boat float along with other blueprints and assets inside it with the rope simulation as well was certainly a challenge. After the blueprint was created with the main boat body as the scene root, the buoyancy actor comes into play. I placed red arrows as visual indicators whose coordinates I took to add to the pontoon points which act as the points above which objects will float. I had to play around a lot with the Buoyancy settings which define how the object reacts to the water waves to get it just right.
The main hurdle I had was with the other objects inside the boat blueprint. Since the weights given add up, after a lot of tweaking with the settings, I gave the unnatural weight of 200 Kgs for the boat and the rest of the assets a negligible value of 0.001 Kgs to get the boat to sink just enough that it looks real and the cloth’s wetness texture matches too. The Rope is part of this blueprint and is positioned to look attached to a pole on the shore.
Lighting and Rendering
Lighting this scene is another part of this project that I absolutely loved. I made sure to apply classic Environment/Level Design principles to not only model the scene and its elevations but also light it in a way that would guide the player to objectives or points of interest. I also used a Lantern from Medieval Game Environment to light the pathway and give life to the night.
I used only a few lights to illuminate the scene and all of them were dynamic. Directional Light as sun and moon, Skylight with Real-time capture as a base light, point lights for candles in the lanterns, and a couple of subtle spotlights to highlight areas during nighttime (fake lights). I used 2 versions of lighting setup to quickly switch between day and night when needed. Volumetric fog along with Light shaft bloom was used to create God Rays. A combination of Distance field shadows and shadow cascade allowed me to get shadows for far away trees without sacrificing FPS while giving crisp shadows in a close range too. Being a newbie in UE4 meant a lot of moving the slider from Min-Max especially when it comes to lighting when there are various factors involved. Many times I believe that's a way to learn something new. I tweaked only a few settings under Post-Process Volume as I would color correct in Photoshop/Premiere Pro.
Setting up Cameras did not take much time as I had imagined how I would shoot shots for quite a while. I'm sure I wore out the manual focus distance option as I used it on almost all my cameras with a 2.35:1 Aspect ratio to get a cinematic look. A Film Back of 48.2mm in width to 20.5mm in height was used. I also added a very subtle camera shake which adds a handheld camera feel. I rendered all my shots with a 300-frame warmup time (to let the particles, wind, and physics effects settle in) at 24 FPS with a 4096x1743 (2.35:1) resolution.
I probably wasted a ton of time just running around in my scene with a rigged character I added from UE4 Marketplace. I simply attached that character to the UE4 mannequin and tweaked his textures a bit.
I did a few takes of the walkthrough of the scene, both day and night, and mixed the footage with a bit of audio editing magic to give footsteps, forest noise, lake sounds, etc. Implementing those right into the engine seemed unnecessary as I was not showcasing my technical skills so I found a cool workaround and a whole lot of time it saved me.
It took around 4 months to create the Medieval Food Stall while salvaging any time I get after work and on weekends but I am happy with the results I have achieved. This didn't come without challenges, namely optimizing the scene enough to be able to work with good FPS by changing LODs, cull distances, and screen spaces for every asset. I also faced a weird issue where any asset I would delete would refresh the Landscape Grass Type so I had to wait for it to load.
Some things I wish I had known before this project was to just dive in and clear out the big things first; I would have saved so much time had I not hesitated to do just that instead of sitting around thinking. I also learned to visualize the final output from the beginning if you don't want to compromise later. In that regard, I’m lucky to have things fallen into place in many areas during composition.
Some tips I could give is to polish, polish and polish more. If you’re like me and at some point during a project have a small thought that your art isn't good enough yet, refuse to be satisfied with the result. I had returned-back many times to the same asset to add more texture details or a camera to move and focus in a different way, however, this can be avoided with proper planning. Also as an Environment artist don't hesitate to use assets from Megascans if you have created the Hero assets of a scene because during production you would be given assets from different teams to create the scene.
This content is brought to you by 80 Level in collaboration with Unreal Engine. We strive to highlight the best stories in the gamedev and art industries. You can read more Unreal Engine interviews with developers here.