Tim Nijs did a detailed breakdown of his recent personal project Well of Souls inspired by the Darksiders 2 lore: sculpting, UVs, texturing & lighting.
Hi! My name is Tim Nijs, I’m from the Netherlands. At the moment, I’m studying Games at Breda University of Applied Sciences in the Netherlands. Besides the projects for school I have constantly been doing projects for personal learning, the Well of Souls is one of them. Around a couple of months ago, I started reading 80lv articles and I have learned a lot. I would like to thank 80 Level for letting me do this interview.
Some of my recent works can be found here.
When I saw Darksiders 2 for the first time I was blown away. I had not seen anything like it. For me, Darksiders has a perfect blend of stylized art and realism. You get the stylized hand-painted look and proportions, but with slightly more realistic materials. My favorite area in the game is the Kingdom of the Dead, a place that is in constant decay. My environment is inspired by the Well of Souls from Darksiders lore, but with my own twist.
I really liked this idea of souls dwelling in a well, awaiting their judgment (Darksiders lore). I wanted to create a well with “windows” that wandering souls would fly in and out of. The initial plan was to make both the well and the entrance area. I thought about how this environment could intersect with the game, the death grip and wall running abilities. After working on it for a while I decided to stick to the entrance area, which was plenty of work already. One of my lecturers gave me feedback that it might be interesting to add something to the bottom of the well, so I added the coffins and bones the souls fly out of.
When working on a project I always like to start on paper, whether that is a quick pencil sketch or a digital painting. I just find it much quicker to work out an idea on paper than in 3D. After I had done some initial sketches and paintings I started to block out my scene and import it right away into Unreal. In Unreal, I set up the first person template. Running around in an environment helps me get a feel for the scale. This made me realize I needed to make my scene much bigger than in the initial concept. To limit the amount of work (since it was a personal project) I chose a circular design with many repeating elements. Damage was used to break the symmetry.
For this project, I wanted to try a new way of working inspired by Michael Vicentes Throne room project. Instead of making the design from start to finish I took screenshots from Unreal and painted over them to design parts of my scene. Once satisfied with the design I blocked it out in Maya and tested it in the engine.
Sculpting in ZBrush
The sculpting work is very much inspired by the sculpts you see from Darksiders 2 and other stylized titles (like Heroes of the Storm). Everything had to have this broken/worn feel to it, and every detail needed a faceted look. So for most sculpts I started with a base mesh created in Maya which had evenly spaced quads and I used creases in ZBrush to remain hard edges. I used to utilize control edges/edge fencing, but I like working with creases a lot more. For more organic stuff like the skulls and bones, I used dynamesh.
After importing the base mesh I always added some bigger damage/deformation to the model with clay tubes. That brush is great but it does leave some brush marks. After that, I used the flatten brush as well as trimSmoothBorder which is a nice brush to make this clean faceted look. I also used some alpha brushes that I sculpted to add some layering or damage, after which I used the flatten brush to blend the alpha into the sculpt. Of course, the famous Orb‘s crack brush was used to add cracks or cuts in some places. Sometimes when a sculpt turns out a little too sharp I inflate the whole model (in ZBrush: tool > deformation > inflate). This just softens the edges a bit (something I believe they do for Heroes of the Storm as well).
For most of the props, the UVs were created manually in Maya. Before starting with UVs I like to think about where to put hard edges or bevels to get a clean normal map bake. The way I UV in Maya is kind of similar to how I used to do it in Blender: I do a camera projection, then split the UV-edges and unfold my UVs. To make sure all UV shells have the right ratio I do a layout in Maya where I check the preserved 3D Ratios and Align Horizontally.
Because these props were going to be hand-painted in Photoshop, I preferred fewer UV shells over less distortion. For the arrangement of the shells, I started by moving all the shells outside of the UV space. After that, I started with the biggest and most oddly-shaped shells first to see how two or three of them could fit together. UV shells that are basically strips of polygons can be laid out straightly to easily stack them (and for a cleaner bake). Some of the smaller pieces were used as filler. I tried not to scatter them all randomly over my UVs, but keep them in little groups.
Here are some tips I learned for UVing:
- Start with the biggest parts first and work your way down to the smaller pieces.
- If you have oddly-shaped shells, try to fit them together occupying one’s negative space with another shell’s positive space.
- When dealing with cylinder-like shapes or arches, lay out the UVs straightly (only with minor distortion).
- When dealing with rectangular shells, start in one of the corners or one of the edges and keep stacking, big to small. Possibly fit them around an oddly-shaped shell.
- Keep similar materials/objects in small groups.
- When dealing with diagonals, stack those objects in groups.
Rubble Piles, Stairs & Dithered Alpha Blending
In Darksiders 2 there are often rubble piles or piles of bones/dust. I think they are a good way to quickly add some visual interest to the floor areas which look slightly boring.
Looking back I might have used too many, but they did help to kind of “glue” everything together.
The stone rubble was first sculpted in ZBrush. I then decimated the parts as low as I could (for a high poly model) and dropped them on a plane in Blender with physics simulation. After that, they were brought back into ZBrush to sculpt the dust pile for the stones to sit in. I tried to sculpt some of the dust piling up against the top of the stones, to emulate the sand falling down over time. I initially planned on making different variations of rubble piles, but scaling and rotating this one pile already gave quite a bit of variation. Looking back I wish I made one more pile that was “thinner” meaning it could run along walls and smaller ledges.
In the original Darksiders, these piles are clipped into the ground. I wanted to find a way to blend them with the floor plane so that there is no obvious intersection. The simplest solution at the time seemed like using alpha blending. I wanted to automate the process by using a depth fade in Unreal, but that is only available for translucent objects. So I decided to use dithered alpha, where I used vertex colors to define what needed to be alpha. In Unreal, there is a material node called Temporal AA which takes a gradient and dithers it. This way you can still use masked alpha. It works as long as the surface underneath the object has a slightly noisy surface finish. I also had the ability to paint sand on the floor, and it helped to blend the elements further.
To create the stairs for this scene I sculpted a section of the stairs that tiles in X and can be repeated vertically. Whenever I’m working with curved or skewed surfaces I like to sculpt them straight first and bend the low poly later after it’s baked. That’s a technique I learned from Orb’s throne room as well. To model the bigger stairs I actually repeated this small section of stairs and then used a lattice to make it conform to the rounded hallway.
To create low poly models for this kind of assets I used decimation master in ZBrush to reduce my polycount. Decimation master does have a tendency to give some strange topology with very long thin triangles. That is not optimal for baking normal maps, so I usually do a manual cleanup pass in Maya. Looking back, I realize that I could have used twice as many triangles.
When it comes to the modularity of this project, I broke down everything into small pieces: trims, stones, slabs, tiling materials, etc. After that, I created bigger modular pieces that can repeat in a circle. This way I could add a lot of variety to those bigger pieces.
Texturing in Photoshop
I struggled with these kinds of textures for a long time looking for the “right way” to make them. However, I talked to one of the artists who worked on Darksiders and she told me there was not really one proper way of creating these textures, you just have to figure out what works for you. Texturing for this project was almost completely done in Photoshop which is quite a traditional workflow. What I like about texturing in Photoshop is that there are no real rules for creating them. In Substance Painter, for example, there is always a “strict” hierarchy of layers, while in Photoshop the different layers of all kind blend together and there is total freedom. Of course, Photoshop does have drawbacks: it has quite a destructive workflow and there are always the UV seams.
These textures were started by creating the albedo first. I took my bakes (curvature, cavity, AO) and created a kind of base, black and white texture. Technically, this meant putting lighting information into the albedo, but for the stylized textures, I don’t mind that so much (as long as there is no obvious directional lighting). AO in the albedo can often read as dirt/grime which was a good fit for this environment.
I then overlayed some photo textures that I got from Textures.com By applying a few filters you can get rid of some of the noisiness in the photos. After that, a gradient map was applied to bring some initial colors. After that, I added some local colors like browns, grays, blues, and yellows. When going from dark to light, I like to shift colors (for example, brown to gray to yellow). More snippets of photos were added here and there to add some grime/dirt, or just some color and value variation. The curvature maps were used to add some of the typical edge highlighting, and an AO mask helped to add a dust and dirt pass. The roughness was created after by adding a black and white layer on top of my albedo layers and then tweaking them (lightening/inverting/etc.). For the roughness, I tried to add lots of variation. It’s always interesting to emphasize elements from your albedo in the roughness map. Some of the objects use some metalness as well. I never used 100% metalness to let the albedo shine through, this is something I learned from Worth Dayley.
The challenge with these textures for me was keeping them consistent, as well as keeping the “level of detail” consistent. What I mean by this is when sculpting two different textures, you don’t want one to be overly detailed, with a ton of small details, and the other to have less and bigger details. Maintaining the same scale for the details is essential. What I usually did was a test bake for around 10 minutes into sculpting. That way I could see if I needed to adjust my course. Another way to remedy this would be to sculpt things with more context by importing some assets into ZBrush, just for the scale comparison.
For a lot of the hero props, I used a unique texture, meaning I could put in all the detail and variation I wanted. For the bigger props that was not an option since they would require way too much texture space to reach the required texel density. So for those assets, I created a sculpt, gave them unique UVs and baked out a normal, AO, and curvature on a lower resolution. A tiling albedo, detail normal and these unique maps were used in a shader in Unreal to add some edge wear and dust pass. The shader also had an option to add a color variation texture to bring in additional dirt and grime. For these type of materials, I like to make instances of master material. For any new asset you then just drag and drop the new input maps, and the material will do the rest.
Souls & Lighting
I have to admit I’m not a VFX artist and these souls are one of the things that gave me the most trouble. I tried using particles in Unreal but didn’t manage to get the result I needed. After messing with particles for a long time, I decided to use some polystrips with a panning texture on them. A noise texture was used to distort the texture slightly. The strips had their UVs laid out 0-1. I used a gradient textures to fade their opacity in and out. The UVs for the cylinder in the middle were skewed to make them go in a spiral. The polystrips work pretty well, but from some angles, the flat surface is quite obvious.
This environment was not made to be used in a real game project, but rather a showpiece for my portfolio. This means it did not run on 60 fps. Many point lights were used to create the lighting. In general, I wanted the souls and candles to emit light. I didn’t really know which one should be the primary light source. I tried many different color combinations of lights but eventually settled on cool vs warm colors. For the candles, I wanted a color that worked well with the overall warm/ orange color palette of the architecture, for the souls I liked a blue or purple tint (just like in Darksiders). Some extra point lights were added either to draw more attention to certain props or to add some additional lighting since the lighting from the candles would not have been enough to light up the scene.
It has been a while since I first started working on this project (must be about a year now). There are things I like about it and definitely things I would have done differently. One of the main things is the ratio between calmer and busier contrasting areas. There is a little bit too much to look at. Another thing is the lighting: maybe it would have been better to pick either the souls or the candles as a primary light source. I think it’s always super important to be critical about your own work. But it’s also no good to get stuck in the same project for too long. I’ve learned a lot while making this project and I’m using everything I learned for the next one.