Santeri Soininen revealed the workflow behind the Stylized Fantasy City project, shared the modeling technique used for the roofs, and talked about the texturing process.
Hi there! I’m Santeri Soininen. I’ve been working in games as a 3D Generalist and Environment Artist for 7 years. I’ve worked on a few indie games, such as Midair and OlliOlli World. I stumbled into 3D art and gamedev kind of by accident after dropping out of university and have mostly just been making it up as I go along. I suppose you could say I’m self-taught, meaning I learned from YouTube, Polycount, etc.
The Stylized Fantasy City Project
The Stylized Fantasy City project started from a couple of different points. I was looking to do something with quite a lot of modularity looking to further explore stylized PBR, and something in a fantasy setting is very much my comfort zone, so that was an obvious choice. I decided to be free-form and exploratory with the way I approached this project, so I didn’t work from concept art.
There was no single point of inspiration or reference, instead, I spent time looking for stylistic, mood technical, and subject matter references. Here’s my ref board from PureRef.
The scene is quite stereotypical in many ways; I’m sure most people have seen something that resembles it in other artwork. Therefore I wasn’t too worried about not having specific concept art. But I definitely don’t recommend this kind of approach to most people.
The first thing I want to touch on is modularity and module granularity. In my initial plan for this scene, I was going to construct everything with a very granular degree of modularity from the individual wall, beam, floor, roof pieces, and so on. However, during my first blockouts, it became evident that this would be quite cumbersome and would not allow me to easily make the kinds of curved, exaggerated forms on the houses that I wanted. So I opted for less granularity and instead constructed my buildings out of three main building shapes and a bunch of extensions.
In terms of the main modeling parts, there’s nothing special going on in the main bodies
of the houses, just standard box modeling workflows for the walls and beams. I used instancing (Linked Duplicates) in Blender quite a lot on all the windows and other repeating bits. This way, I was able to place my blockout windows where I would want them and then update the models later. I modeled all the houses straight and then used the Lattice modifier to bend them in order to keep my workflow as nondestructive as possible.
I kept things as low poly as possible until I needed to add some resolution for vertex painting later. The roofs use a technique I’ve seen pop up in a couple of places, most notably Toivo Huhtaniska's interview for 80 Level.
I subdivided the flat roof meshes, then used the Displace modifier in Blender to displace them based on the height map from my roof texture. After that, I decimated them to get a more acceptable game resolution mesh. The final step was to edit the normals to be fully flat (all pointing in the same direction as the original plane) so that the normal map from the tiling material renders correctly.
The peak and bottom edge shingles consist of individual shingle meshes that I baked onto an atlas to break up the silhouette.
For the background castle, I mostly didn’t give it as much attention as the foreground elements. But I did still go in and bring it up to a reasonable level of quality by adding trim and some secondary details. This is where it was extremely handy to use the Array and Curve modifiers to quickly place a ton of these rock meshes on all the edges I wanted. The main shapes of the castle were all rather quickly bashed together with booleans. Keeping a lot of things as booleans in combination with arrays and mirrors allowed me to keep things nondestructive and quickly iterate on the design.
In order to get the most bang for my buck in terms of sculpting time, as well as to keep things consistent, I sculpted a set of generic stones and got a whole lot of reuse out of them. The generic stone sculpts were used to create a tiling stone texture and then also baked onto an atlas of individual stones that I could use to construct anything I wanted. I used Curve and Array tools in Blender to add the individual stones on the corners of a bunch of models.
I also used the high poly stones again on the pillars of the chapel: I assembled the high poly from the previously sculpted stones in Blender and then baked it to its unique texture.
I also sculpted a bunch of smaller props, as well as key assets I knew I wanted a little bit more fidelity on. Most of these could have been textured with my existing trims, but I chose to go for the extra fidelity instead.
I’ve already touched on some baked textures but let’s go into a bit more detail here. I sculpted all the tileables for my textures in ZBrush, then assembled my final bake models in Blender and baked in Substance 3D Designer. I used Designer for all of my tileables and Substance 3D Painter for the individual assets. All the wood beams were textured with a trim sheet using the Ultimate Trim Sheet technique pioneered by the people at Insomniac. I originally planned to use it for other aspects of the project as well, but it ended up not being a good fit for all the things I wanted to do.
All the base color work on both tileables and unique assets was the product of just some simple AO, curvature, and height-based effects as well as brush stroke masks generated from alphas I created in Photoshop.
I kept all the texturing 99% procedural for the assets as I didn’t want to sink too many hours into hand painting.
The large-scale variation in the scene comes from a combination of world space triplanar brush textures, vertex paint (blends modulated by more brush stroke textures and AO), and decals. Here’s my setup for the world space color variation. I just chose two arbitrary colors and kept them at a very low intensity (0.3). Here, you can see the effect of the variation when cranked up to full.
The decals were hand-painted in Photoshop with some painterly brushes and the shader setup is a very basic solid color with variation provided by a world space brush stroke texture.
This was my first project where I realized that making a quick blueprint to control some basic parameters on my decal materials through MaterialInstanceDynamic saves a ton of time and makes duplicate material instances for every possible situation.
Composition and Scene Assembling
I think the gif covers most of it! I had a pretty decent idea of the main composition from my initial sketch and focused heavily on the main camera angle. That means I spent most of my level building and set dressing effort on the areas that are closer to the camera and left everything else pretty rough, as you can see from the aerial shot of the city.
With regards to composition on the main camera angle, I struggled a little bit with figuring out how to have all of my elements in there while keeping things feeling cohesive. One mental hurdle here was to abandon the notion of having just a single strong focal point and instead make peace with the fact that there’s a lot to look at in the picture, and so I wanted to let the viewer's eye wander around the image, taking in the city as if they were in a video game – seeing all the possible things they could do as well as their ultimate goal in the castle and a path upwards towards it.
This is all to say that composition fundamentals are extremely important, but it’s not always the best approach to keep to rigid composition rules in every case.
A couple of additional notes on how I assembled things inside Unreal Engine: I created a few different preset building assemblies as Blueprint actors out of my main house and house extension pieces, as well as windows and other detail pieces. I was then able to very quickly populate the background city with those. This approach could have been taken further and done better if I was to create something like this in actual production. That was the general mindset for most of my workflows: everything could be cleaned up and scaled up to work in production if necessary, but I didn’t waste time doing all of that on a personal project.
The terrain is a basic height blend material between 4 different layers. I used the Landscape Grass System to place grass on all the areas where the grass layer is painted.
Lighting and Post Processing
The mood I wanted to go for was something sunny, bright, and comfy. So I played around with my light angle and eventually landed on a late afternoon-ish time of day.
I chose to use UE4 for this project because 5 still had some stability issues around the time I started it.
I decided to try out Nvidia's RTXGI plugin for my Global Illumination, and it worked great for this scene! I chose to push my GI intensity quite a lot to make the scene feel lush and warm.
The lighting in the scene consists of just the Directional Light, Skylight, and the DDGI volume.
For the post-processing I used a LUT texture, meaning that I did all of my post-processing adjustments inside Photoshop with adjustment layers.
Every project is a learning opportunity and a unique challenge. I struggled quite a bit with this scene because of not working from specific concept art, as I knew I would when I started it. I also learned a lot about how I would probably want to set up my buildings in the future if I was to do another similar project.
Perhaps one takeaway for people reading this would be to remember that not everything has to be perfect. This scene has a ton of pretty rough elements and unrefined textures but it still works (at least I hope it does.) Work smarter, not harder, and focus your efforts on where it will be seen, not on some prop hidden in a corner that no one will see.
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.
You may find these articles interesting