Benjamin Roach talked about the way he recreated the Dark Souls 3 scene in Unreal Engine.
3d artist Benjamin Roach talked about the production of his experimental environment, which recreates the iconic scene from Dark Souls 3. This is a great look into the the pipeline and some of the peculiar features of Unreal Engine 4. A very nice example of modular approach to scene design.
My name is Benjamin Roach and I currently work as a Prop & Environment Artist for a small outsourcing company in Shinjuku, Tokyo. I work on games, TV and movies but my true passion lies in creating real-time game environments.
I originally studied at the Academy of Interactive Entertainment in my home county of Australia back in 2009. After graduating I kept myself as busy as possible doing online mod and mapping work for games such as Killing Floor and Team Fortress 2. After I made the big move to Tokyo I was lucky enough to land a junior position in my current company.
Dark Souls 3 Scene
While playing through Dark Souls 3, I was constantly mesmerized by the environmental work from both an artistic and technical standpoint. This really inspired me to want to recreate a section that I found particularly interesting within Unreal Engine 4. I noticed that they used a lot of additional basic geometry to break up repetition and add interest through silhouette value on areas generally close to the player.
Another point I discovered while analyzing the original scene was the clever use of efficient modular pieces to make up the vast majority of the level. To prevent obvious repeated use of assets they utilize foliage and broken variations of columns, archways etc.
Basically what I wanted to achieve with this environment was something that sticks very closely to the original reference (approximately 90%) with about a 10% leeway to add some of my own ideas or try to improve certain areas. I also wanted to design the level as if it was part of a larger open-world just like Dark Souls 3. This means a strong focus on performance through LODs, shared UV space, highly flexible substances and current generation technical limitations.
Building Architectural Elements
As Dark Souls 3’s environments are predominately large and detailed I discovered that modularity and flexibility were key to making the level when it comes to models. There are very few unique models in my entire scene which is the same as the original. Back in the planning stage I identified all the modular assets and created a detailed list in Google Sheets to keep track of what I had to make and what stage the assets were at. The artists at From Software are very talented in removing obvious repetition in their environments so it was not an easy task to single out each one.
My basic workflow for static meshes were to model a ‘Block model’ in 3ds Max (no UVs or Textures) and once all the assets were at the Block model stage I assembled the scene in 3ds Max to get an idea of scale and size. Having the models in such a simple state makes it very easy to go back and make changes without losing time. The next stage was to make a detailed model, which has additional modeled geometry and final UVs which allowed me to do a ‘damage pass’ in Zbrush. Finally, I used Quixel Suite to texture the models before moving into Unreal Engine for material setup.
I noticed the repeated use of scaled, rotated and modified columns and archways in the original. There are also sections where modular parts have been mixed and matched to make new modular parts. A large scene without obvious repetition can be created with very few individual meshes as long as you can rely on solid planning, flexible modeling and texturing and what I call ‘break up meshes’.
To add another layer of variation to your scene you can simply create damaged and broken versions of your current meshes. This is incredibly efficient because it is still using the same model, UVs and materials of your base asset.
Foliage was also pivotal to hide repetition and add a large amount of interest to any scene. I used a mixture of Max and Speed Tree to create my various foliage models. To prevent foliage from taking on that flat/fake feeling I found it necessary to carefully design my clusters of grass and ivy to best make use of their positions in the level. I also adjusted the normals to reflect this too. Finally, adding additional singular leaf cards really adds a 3d feeling to the foliage at a very low price on performance. This was one of the few areas I really wanted to push past the original scene.
My final conclusion on modeling was that it is not practical to spend as much time and care on each individual asset as I would have liked to. To create such a large scene in a timely manner I had to make sacrifices. By themselves the assets are rather plain, but together they become a detailed and interesting environment.
For all of my static meshes I used Quixel Suite. This gave me huge advantages such as the power of photoshop and the ability to save out my own Smart Material library. I also added my own PBR materials for use with Quixel powerful masking. Most of the static meshes are a form of stone or concrete so once I got a few good base materials I could save them out and apply them to new static meshes so that all I had to do was add/remove details and adjust color values.
For my large tiling materials I mostly used Substance Designer and some Zbrush. Talking about flexibility again, this allowed me to make non-destructive changes very easily and made it possible to quickly make variations of the same textures. Substances also integrate perfectly with Unreal Engine to create efficient and adjustable end materials. I kept most of these textures completely procedural, but some such as the dirt/mud ground material was also used in conjunction with Photoshop and Zbrush.
I packed the channels of the textures because as I mentioned earlier I still placed a high emphasis on performance even though this is a portfolio piece.
Vertex painting was another powerful feature I took advantage of in Unreal Engine. Having such a modular environment means that you need to utilize as many ways to break it up as possible. For example, my standard tiling brick wall was a Substance that used three-way height masked blending to mix the bricks with moss and also a light plaster-type material.
I could also add a moss/grass layer to my ground material to help blend the grass cards with the dark muddy dirt underneath.
Foliage materials were a challenge because of the low light and contrasting shadows. I added saturation control, emissive colour/strength, subsurface controls and opacity values. Once the lighting started to take its final shape I had to continually adjust these to get the look I needed. I found it was better to make brighter textures in Photoshop and then adjust them inside Unreal as opposed to trying to get the look directly from your image editing package, and then having textures that are too dark or saturated.
I wanted to stay fairly close to the original reference, so scale became a very important factor. I had to constantly return to the game and take screenshots of archways, corridors and columns so that I could get mine as close as possible. Being a 3rd person game I had the advantage of using the default 3rd person camera in Unreal to match with that of my Dark Souls character. It is obviously not a perfect measurement tool, but it allowed me to get rough values such as knee-height wall trims, shoulder-height column decorations, etc. To improve the accuracy of this method it is important to match your in-engine camera focal length as closely as possible to the game, concept, or reference camera angle.
Most people will look at their reference and assess how tall/wide it is and then try to loosely match it themselves, but I think it is really important, if not more important to assess negative space when making these calculations. For example, the amount of space between the edge of a column and the start of a door archway on either side. If you have your focal length and camera bookmarked in a position that matches your reference, you should be able to overlay it and match these empty spaces.
Finally, as I mentioned earlier, I knew that scale and size would change a few times throughout the project as the scene came together. This is why my models were made from the start with a bit of flexibility to allow for easier changes.
Working with UE4
I chose Unreal Engine because I have some experience with it but also because it is so well documented that you can find almost anything you need on resources such as Polycount, Unreal Forums and YouTube. I also like the interface and its connectivity with Substance Designer and Quixel Suite.
I decided to avoid making a block out using BSP and instead opted to create my base layout in 3ds Max and import placement and other adjustments between Unreal and Max because I am much more familiar and confident with it. Once my static meshes started to take their final form the Max layout was removed and all of the tweaking was done in Unreal alone. Thankfully it allows you to make iterations on models and replace them while keeping translation data and materials.
For the ground tiles I had already modeled and textured a few variations and these were individual assets. In order to cut down on hand placement time for these tiles, I made a general grid of them in Unreal and then grouped them and placed them in large patches that lined up well. Once they were all in I went over it again, removing obvious repeating by deleting and adding additional tiles as well as broken versions.
I decided to start the lighting work at a very early stage for a couple of reasons. Firstly, as everything came into the engine after the ‘Detail model’ stage, I had all my assets in position with only normal maps and flat grey texture. This gives me a nice simple canvas to build my lighting over seeing clearly where lighting is falling, shadow lines and colours.
Secondly, having some base lighting that is somewhat similar to the final lighting gave me a more accurate environment to test my textures and materials in-engine with. I find that the Quixel and Substance Designer viewports, whilst very impressive, are not so accurate to the game engine conditions.
I used mostly stationary lights as these worked best for me. I added a few very low-intensity lights to fake some extra bounce lighting as some areas were very difficult to get the indirect lighting to reach.
I tried to get as close to the reference as possible using only lighting and material values. Right at the end I added a Post Processing volume which adds so much control over your look without having to wait through another lighting bake. In particular I really liked the colour grading with an LUT. It made it possible for me to take a screenshot and then adjust it however I liked in Photoshop, then import this into the engine and use the settings on my post processing settings. This helped me nudge the overall look closer to the original.