Digital Artist Yannick Deveux has told us about the working process behind the Inn in the Woods project, shared the lighting setup, spoke about optimization, and explained why Unreal Engine 5 was used for the environment.
I’m Yannick Deveux, a second-year student at Howest Digital Arts and Entertainment. I only started learning about 3D art a few years ago. At the time, I was working in internal sales for an industrial company. Hoping to change my career to something I am more passionate about, I attended an information day at Howest, and it was love at first sight, so much that I told my boss I’d resign by the end of Summer. That’s how I found myself in my first year at DAE, learning about low poly modeling, programming, drawing, and more.
I made several other scenes in both UE4 and UE5 before tackling the Inn in the Woods. All in all, it took me about a year to learn Unreal Engine, from the very basics to dressing and lighting a proper scene. Previous assignments include scenes with dynamic lighting as well as baked lighting.
The Inn in the Woods Project
For this project, I wanted to follow a piece of concept art more closely. Browsing ArtStation, I landed on Eddie Mendoza’s page. It took me a while to choose the concept I needed, as he has so many great pieces. I particularly liked The Witch's Inn because most scenes that involve witches are dark and a little creepy, while here, they just seem to enjoy a day out on a hot summer day. I wanted to capture that peaceful and summery feel to it.
In order to create a natural-looking scene, I also collected photo references. To do that, I usually try to break down the concept, and in this case, I ended with a few categories: forest and forest roads, log cabins, and medieval roofs.
These references are needed to nail the build-up of the foliage and terrain, the lighting, but also to fill the gaps in the concept, for example, the way different wood pieces connect in the cabin. As some things work great in 2D, they don't always translate well to 3D.
Modeling the Assets
The assets used for the environment are a combination of Megascans, various asset packs, and pieces I modeled myself.
Let’s start with the ones I made myself: the inn and the welcome sign. My general workflow for this project was to model individual pieces in Maya and import them to ZBrush to create the high poly versions with sculpted details that I’ll later bake down in a Normal Map.
In order to save time, I decided to try and make use of the Megascans textures instead of texturing everything myself, but I’d need a way to integrate my own Normal Map with the Megascans’ Normal Map. This was done by using a custom shader where I would create a material from the library's maps and then blend it into my own map.
A particular life saver was the MASH feature in Maya that I used to scatter a few different roof tiles on top of a plane to create large roof pieces. This allowed me to save a lot of time while still creating a natural-looking roof, thanks to small randomizations you can add to the transformations of the tiles.
The welcome sign was made much in the same way, except for the actual "Welcome" text. For that, I prepared an Alpha in Photoshop and used it as a decal in the engine.
Next is the greenery, all of the assets you see in the environment are either Megascans assets added with Quixel Bridge or asset packs from the UE Marketplace. Most of these were placed using the Foliage Painter Tool in the engine. Starting with a large brush with a high variety of plants and trees to fill the scene, I then reduced the brush size and variety to paint in specific areas. I ended by placing individual plants and trees to add to the composition of the scene.
I did not texture much myself as most of the models are Megascans assets with ready textures. The main challenge here was to seamlessly integrate all those different pieces into the environment.
One of the features I used to accomplish that is the Runtime Virtual Textures. These allow the engine to sample the texture of the landscape material in a specific location by adding a small material function to the default Megascans material. The sampled texture is projected on top of the Megascans asset, where it intersects with the landscape. This way, all Megascans assets on the ground will seamlessly transition into the landscape, which will make it look far more natural.
I used this same technique to create the cart tracks along the road. The sampled virtual texture is used as a base material and then blended into the Normal Map of the cart tracks, so the decal blends in perfectly with the landscape.
Using Unreal Engine for Environment Art
The main reason to use UE for environment art is its lighting capabilities. Lighting will make or break any scene, no matter how high-quality the assets are. When using a dynamic light setup, you can make full use of UE5’s Lumen feature. The Lumen Global Illumination will make your lights bounce naturally in your scene. A single directional light will already give you a very strong base to work on. Where before you’d need dozens of local lights to fake the indirect lighting, now you only need a handful of them to light up the darkest areas of your scene or create gradients for some more art direction.
Nanite support for Megascans assets is also a nice bonus, providing a good alternative to the usual LODs workflow. Nanite also doesn’t support masked, translucent, or two-sided shader features (yet), so it can’t be used for the foliage, which was the biggest hit on performance for my scene. While Nanite is very useful, it wasn’t as impactful as Lumen for this project.
The general rule I apply here is this: if the player can’t see it, don’t bother rendering it. This goes for anything – from actual geometry to shadows.
The biggest challenge for this project was the trees. I initially found an asset pack on the Marketplace with really good-looking trees. Filling the scene with these, however, would make the Draw Calls skyrocket, since every tree was very high poly and had multiple material slots.
To solve this, I divided the trees into three different groups, depending on how visible they are from the camera point. Close to the camera, I would use the good-looking trees from the asset pack. The rest of the scene was filled with lower-quality trees from a different pack, and in the back, I used simple planes with a treeline texture.
In addition, I turned off all shadows on the trees, then proceeded to turn some shadows back on until I had the desired effect. This caused the highlights on the house to become very flat as it lost all the tiny shadows from the foliage. To compensate for this, I used a light function on my Directional Light to fake the slight foliage shadows.
I also ended up replacing the built-in Atmospheric Sky and Volumetric Clouds with a sphere with an unlit shader since the time of day doesn’t change for this scene.
Lumen doesn’t support baked lighting yet, so every light in the scene is fully dynamic. The setup consists of a Directional Light, a Skylight, and a handful of local lights. I like to work with the temperature feature on the lights to set the mood. This allows me to add a nice hue to the lights while keeping the natural look.
The Directional Light and the local lights that emphasize the highlights are warmer to get that nice summer day feel.
The Skylight and local lights that light up the shadow areas are colder to create some nice contrast.
I added some color correction in the Post-Processing Volume at the very end to make the whole scene a bit warmer.
An environment only looks good when all the elements are in place: the assets, the lighting, the particle effects, fog cards, post-processing, etc. So, it’s sometimes hard to judge if you’re heading in the right direction during your project. After the initial blockout and first lighting pass, I got into the rhythm of placing assets followed by a lighting pass, back to placing assets, etc. It’s important to place enough assets before judging your work, a single tree on a hill is going to look weird no matter what. Take enough time looking at references to study the way things are built up. The foliage doesn’t just disappear near the road, what kind of plants become more prominent near the road, etc.
Asking for feedback is very important but be precise. “I need some feedback” is pretty vague and usually very difficult to answer. A better question to ask is “what’s the weakest part of my scene” and make that your highest priority.
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.