Creating 3D Scene of Decaying Orthodox Church in Swamp
Nicolas Pablos discussed the workflow behind the Cult of the Tsar Fish project, explaining what inspired the scene, how he used a detailed sculpt-to-texture pipeline with ZBrush and Substance 3D Designer, and detailing how he built layered swamp vegetation from scratch.
Introduction
Hey! My name is Nicolas Pablos. I'm an Environment and Material Artist from Spain who recently graduated from GNOMON School of VFX. I've always been into art. My dad is an artist, so growing up I've always known I wanted to do what he did. I was also very passionate about worldbuilding in video games and loved exploring their worlds.
I was fascinated by their stories, atmospheres, and how they were made. Luckily, I discovered Blender and Unity in high school and took my first steps into the 3D world. That's when I knew I wanted to join the creative industry and build the kind of experiences that once inspired me!
Inspiration and Mood
I've always been a massive fan of the S.T.A.L.K.E.R. and Metro games, especially the mood and atmosphere they have. That run-down, desolate vibe was exactly what I wanted for my next project! Since I knew this would be my final project at college, I really wanted to push myself, create something I have always wanted to make, and reinforce all the things I thought I could improve upon.
I came up with this idea of a sinking Orthodox church, sitting still in an Eastern European swamp that some mysterious group of people still inhabits. I wanted it to feel run-down but lived in, the dense vegetation slowly swallowing the dock. I was responsible for all aspects.
This environment needed to be readable at a distance, with clear composition and a focal point, which was the church. But I also wanted the viewers to notice all the intricate details in the brickwork and textures.
It was a careful balance between areas of detail (noise) and areas of rest (clarity). I wanted the story to come through the environment.
Reference
Reference, reference, reference! I like to use lots of references in my projects so I have a better understanding of what I'm doing, the way things look in real life and why. If I don't know something, it's good to search for it! Here is an overview of my PureRef file.
It was an ambitious idea, and I tackled a lot of things, from vegetation creation to rubble simulation. Overall, it took me 12 weeks to complete. Here is a quick progress time-lapse of the entire project!
Planning and Blockout
I am a bit of a purist. I like to handcraft every single aspect of my environments, and that means working from my own original ideas too. I started with a simple concept sketch and reference gathering to quickly establish the mood of the scene. I knew this project was going to be a big undertaking, so I started planning and gathering references as soon as possible.
I made a list of all the props, materials, shaders, and modular pieces I needed. I also drew color-coded diagrams to know where I'm going to need tileables and where I will need trim sheets. This gives me a pretty good idea of how many things I need to do. At a glance, I can estimate how much I have left to do.
The blockout stage is very important. I use it to quickly establish the proportions and silhouette read, and since the building was so far away, the silhouette was crucial. Here are all the blockouts I created; you can see they get more developed as I got closer to what I wanted.
When I say I am responsible for all aspects, I mean it, which I think is great, as it lets me practice tons of different things!
Modular Kits
One of the core goals for this project was modularity and reusability. Since the church building was so big, I planned to create an assortment of modular kits to construct it. It was textured using different tileable materials, trim sheets, vertex painting, and floating edge decals to break up the repetition of the textures.
One of the most important aspects of constructing modular kits is maintaining a consistent Texel Density. If different pieces have different resolutions, the player will quickly notice. For this specific environment, all the pieces shared a 512 pixels per meter (px/m) Texel Density.
Splitting the building into smaller modules was great for optimization since it allowed camera culling to only render the pieces that were in view and disregard the rest. Additionally, I had only one draw call per piece since only one material was assigned.
Here is a quick breakdown explaining how I assembled the main bell tower by using a combination of different modular pieces and trim sheets:
To create the illusion that the crumbling building was inhabited, I wanted to add pathways and scaffolding to the outside. I created a modular wood scaffolding kit out of a few wood beams that I could mix and match to create platforms. Here are some examples of what I could make:
I blocked out the basic shapes for the wood beams in Blender, focusing on creating different shapes for a more interesting composition. For the detailing pass, I used ZBrush; I wanted to make the wood look old and splintered, like it had been waterlogged. Greater details and damage were sculpted, anything that would alter the shape of the wood, but most of the material definition came from the texture work.
I then created low-poly optimized variants and baked the high-poly. Since the beams would be seen up close, I tried pushing the texture work with color variation gradients and by adding extra details like ropes to tie everything together.
Here you can see how I used the different pre-assembled kits to add scaffolding and supports to the outside!
It had to feel like someone built the scaffolding with whatever they had on hand, with the ropes being hastily tied. One way I achieved this was by rotating and scaling the different kit pieces so it looked like each platform was different.
Brickwork
One of my favorite things to create is bricks and rubble. Since the entire building was brick, I knew I had to be smart about how to approach it. I didn't want to make it look too flat, but I also couldn't sculpt every brick for optimization purposes. I created different variations of modular brick trims I could add to the outside to decorate it and make it more interesting.
I would work from a blockout to create a model with the general silhouette shapes in place, asking myself how these brick ornaments would have been structured in real life during this step.
I started by researching how game studios make bricks; every studio has its own workflow, but there is a lot of overlap. I ended up coming up with my own workflow. I put together this mini-tutorial explaining how I approached all the brickwork for the building, from materials to meshes! The first step was to sculpt the bricks.
To make the tileable texture, I used the bricks I had sculpted and arranged them in a believable way. I made sure to move them exactly 2 units, so they would tile seamlessly. For the mortar, I created another plane and gave it some texture with a Spray brush. It's very important that whatever brush is used has WrapMode set to 1 so it wraps around the mesh to become seamless.
The problem is that the Height map ZBrush outputs has no mask information, which makes it very difficult to separate the bricks from the mortar when texturing. So I applied two different vertex colors and exported an additional flat GrabDoc; this creates a color mask that can be used in Substance 3D Designer!
I set the document size to 2048 x 2048 and exported the GrabDoc. This gave me a 2K map, which I used as height input in Substance 3D Designer. The raw result from ZBrush is good, but I like to add additional damage layers like slope blurs and blend different masks to elevate the material to the next level.
By using the Color ID Map from ZBrush as an input, I could generate different variations of brick colors. Here is a little breakdown of the Albedo creation.
What I ended up doing was creating two variations of the same material: a clean version of the brick and a damaged one I could later blend between in the engine. This is a workflow I learned from Jon Arellano, who was my teacher at the time. This way, the textures wouldn't look too uniform or repeated.
Since the building had to be fully modular, I wanted to be able to swap materials on the fly to preview them. Thankfully, Unreal Engine's layered material system gave me exactly what I was looking for. Every tileable had its own layer instance in which I could change all parameters, and an additional blend asset to control how the textures blended and interacted with each other.
Additionally, I made use of a second UV channel to add things like leaks and grunge stains. My mentor at the time, Javier Perez, had an amazing demo on creating a shader with fake normal shadow, which I used to give the illusion of the plaster being on top of the bricks by casting a shadow over them.
This pipeline came in amazingly handy; it's incredible how much detail you can add with some shader math and a second UV set.
Mesh Trims
I am a big fan of the baked mesh trims MachineGames showcased for their new Indiana Jones game, so I attempted to create something similar. It would be great to break up the silhouette of the church building and create more visual variety. I planned to make different meshes that would snap to the sides and ends of the modular kit showcased before.
And since I already had sculpted the bricks, I could reuse the same ones to build the mesh trims like you would build them in real life, brick by brick. This gave me a really good base, but the bricks were still floating in the air. To create the mortar, I blocked out a mesh in Blender and sent it to ZBrush to prepare for sculpting.
I then used the Clay Buildup brush, set to spray mode, to carve and add mortar wherever I saw fit. Before merging the bricks and mortar into one mesh using DynaMesh, I assigned two different vertex colors to the high-poly, as I had similarly done with the texture. Then I used the Decimate Master to optimize the trims to be game-ready.
Texturing becomes way easier when I have a color ID map that differentiates between the brick and mortar. Since I already had the tileable brick texture, I simply sampled the colors with the color picker in Substance 3D Designer.
The good thing about having the bricks already sculpted is that I can reuse the same bricks I used for the texture to build all types of meshes, like additional trims, arches, rubble piles, etc. And since the bricks are consistent in shape and size, they will integrate seamlessly into the building. Here I showcase the high-poly sculpts:
Some of the other assets I did with this workflow included the brick archways on top of windows and doors, the corner pieces for the ends of walls, and various brick clumps of different sizes. I added all the elements and then took them to Blender for retopology. This workflow allowed me to create new pieces incredibly quickly!
Vegetation
I'm a big outdoorsy guy, which means I love real-life vegetation almost as much as I like digital vegetation. Since the scene relied heavily on vegetation, I knew I would have to push my foliage creation skills to the next level. I asked myself what types of vegetation grow in swamps? What's the climate like?
By looking at references, one thing that became extremely clear was how dense and varied swamp vegetation was. I decided to approach this by using different-sized vegetation layers: low reeds and grasses for the ground, medium-sized swamp grasses and shrubs, and tall shapes like cattails for the breakup.
Instead of sculpting and baking one giant hero tree asset, I realized I could get a better texture resolution by splitting the tree into two parts: the core tree asset with all the branches included, and a root kit for the lower half. I created a modular root kit that I could join to create different root variations. This also gave me the freedom to change the shape and composition if I didn't like the root formation.
I collected lots of references that showed roots contorting and wrapping around each other. These would be great to add detail to the dirt embankments and the tree. Thankfully, ZBrush's ZSpheres are incredible for blocking out organic assets like twigs and roots. This gave me a very solid base from which I could move, twist, and sculpt the roots. These are the different steps I took:
Here is a short breakdown that showcases how the roots were joined in-engine and blended with the tree to make it bigger. It's very important to have consistency in shape language, so I assembled the roots from big to small shapes. Large pieces came out of the tree, and then smaller twigs grew out from the ends of those.
In the end, I had a dense swamp willow; now all that was left was to add all the hanging moss from the branches.
Since swamps are very humid environments, I wanted to add hanging moss growing out of the large trees. This specific one is called Spanish moss. It's very recognizable due to its falling, long, and twisty appearance, which I found challenging to recreate. I was having a hard time getting the results I wanted in Substance 3D Designer until I found out FiberMesh in ZBrush gave me exactly what I needed! After changing some settings and giving it some thickness, I baked the clumps into an alpha card using Substance 3D Painter.
The texturing process was pretty straightforward: an overall gradient from top to bottom, some color variation, and a transparency mask I authored by using the Dirt Generator to drive opacity.
I wanted to make all the vegetation in the scene from scratch to really push my foliage creation skills. That meant I created different vegetation atlases I sculpted and baked in Substance 3D Painter.
I assembled some high-poly versions of the foliage assets in SpeedTree, which I could later bake down onto cards to create an optimized atlas.
It seems Lumen's AO fields do not like thin meshes with opacity. I had shadowing artifacts in many vegetation assets, which I solved by adding a World Position Offset shader for the wind. Here is the final result of more vegetation assets in the scene and how they were assembled.
I also created 2 bark textures that I used on the tree and the roots.
This root kit was used throughout the scene to ease the transition between the large trees and the ground.
Materials
The closeness to the water meant the ground had to be muddy and wet, so I paid extra attention to the Albedo and Roughness maps. I used Substance 3D Designer to create the materials. With so much variation in ground textures, it was tricky to get the blending and color values between them to look correct. I like to do little tweaks and jump back and forth between Substance 3D Designer and Unreal Engine.
To create the riverbed pebbles, I sculpted them first so I could later create mesh piles of them. Once I baked them onto an atlas, I used the Atlas Scatter node in Substance 3D Designer to pile up three different layers of pebbles: big, medium, and fine sizes. Jared Sabotta showcased this workflow in detail. I find sculpting what I need first gives me more manual control over the result, and I can later reuse those models for different purposes!
I didn't really have much experience in Substance 3D Designer at the time, so my goal was to improve my material workflow. Since I wanted the foreground terrain to feel muddy and wet, I made 3 different mud variations with different levels of wetness. Here are some of the materials I created for the terrain:
I then applied the tileable mud textures to a dirt embankment kit. This way, I could give the ground a more realistic breakup. A simple RVT shader allowed me to blend assets like the embankments or the rock piles with the ground.
Trim Sheets
Tileable textures are great to cover large surfaces, but are often boring. One way I give more detail to my environments is by combining tileables with trim sheets. In this case, I created a hybrid trim sheet to work in conjunction with the tileable roof panels. It was a simple horizontal trim, so I did everything in Blender, and since it would be baked down onto a plane, I really made it high-poly to get a good bake.
A little trick I learned is to duplicate the trim sheet and copy it to the sides. This way, when you bake the Ambient Occlusion, it's also continuous.
The trim had different sizes of beams I could map to the roof. On the bottom half, I made space for floating decals with opacity. This way, I could overlay floating geo decals if I wanted to add bolts or rivets in specific places.
I also created this worn concrete trim sheet, which I heavily used to create a separation between brick walls, support pillars, and window frames. I blocked it out in Blender and sculpted the high-poly in ZBrush. I always try to make the best use of the trims by using them in as many places as possible!
Props
I wanted everything in this scene to be handcrafted and made from scratch, especially since I wanted to add lots of close-up shots. I tried to ground everything in reality by thinking about how years of water damage and decay would affect things in real life.
Bigger props were created as hero assets, like the boat, and had unique texture maps. The boat had to show signs of aging and heavy use, so I added things like algae buildup at the bottom and peeling paint.
I cannot stress this enough: keep everything in organized and properly named folders. If you like texturing by layering a lot of details as I do, it makes it very easy to find what you are looking for later on!
I also created more generic props in the medium to small size range to set dress the environment. These would be placed inside the church as well. I thought about what types of items whoever lives here might have; maybe they're a smuggler and have lots of alcohol bottles? Maybe they have buckets to collect rainwater, or maybe the roof has leaks? These are all things I want to portray in the texture work.
Set dressing is one of my favorite things in environment art. It's very rewarding to see your environment come to life by adding all sorts of boxes, crates, and bottles.
Lighting and Rendering
I consider lighting one of the most important aspects in environment presentation. I knew lighting could really make or break this scene. At this stage, most of the models and textures were done; the lighting needed another pass. It's always helpful to ask peers and friends for feedback. They often see things you missed and give new ideas.
My mentor and peers gave me amazing feedback, which helped me push the lighting further. Looking at references from similar places and light conditions in real life was also extremely helpful! This was my first lighting setup.
Additionally, since one of my core goals for the project was optimization, I decided not to go with volumetrics. Instead, I took inspiration from game lighting; simple fog cards and a cloudy skydome were used as the backdrop for the scene.
I created a simple dome with inverted UVs where I could project my HDR skybox texture. I panned the texture with some simple shader math. It was way more performance-friendly than volumetric clouds. Ghislain Girardot has an amazing video explaining the skybox techniques game studios like Naughty Dog use to create believable but also really cheap skies:
Since the church was so big and so far away, not only did I have to think about the silhouette while I was making it, but also how to light it so it would pop out. I started by creating a more overcast lighting setup, but it was flattening the scene too much, so I decided to go with this late sundown.
One of the things I had to think about was directionality. The best way to create contrast is to have light on shadow. Notice how half of the bell tower is lit, and the other is in shadow.
One trick I like to do is to add a desaturated post-process volume I can toggle on and off. This allows me to check that my values are not overexposed and make sure the focal points and contrast are in the right places! Plus, a black-and-white image of your work is always cool for your breakdowns.
To present my work, I always like to add a bit of movement, so I rendered different zoom-in and pan shots into videos. I am a big fan of Unreal Engine's built-in post-process tool. If you can make it look good in-engine, post-processing will only elevate it. I added a simple post-process volume and tweaked the vignette and sharpening. I would say the most beneficial tweak I did for the environment was adding the subtle sharpening. With so much detail at a distance, this made it easier to read and distinguish. I used a combination of Krita and Affinity for the stills and DaVinci Resolve for the videos.
Conclusion
This has been the biggest project I have made to date, and it taught me many important things. I really enjoyed doing everything by hand, all the modular kits, coming up with new workflows, and learning by creating. It really pushed my skills to the next level and forced me to have a better understanding of composition. Modularity and reusability made it incredibly easy to build up the church, and I'm glad I kept everything optimized and organized.
Overall, it took me about 12 weeks to complete the piece from ideation to finalization. Then the breakdowns took an additional 2 weeks. The most challenging aspect was probably the vegetation. Swamp foliage is very dense, and getting that read was very hard. By layering different sizes of plants and using lots of reference, I achieved my goal. If you can understand the problem first, then you can solve it.
The biggest takeaway from this project for me was how much planning can help me. Sketching out and writing down what props and materials you will need, how and where, really helps you know where you are and keeps you focused on what you need to tackle next.
If I had to give any piece of advice to aspiring artists, I would say don't be afraid to ask questions and ask your peers for feedback. There were so many things about this project I was doubtful of, and through asking, I learned so much! Choose a project you are passionate about; use plenty of references; there's no such thing as too many references. Don't just copy; understand. Know your fundamentals. And never stop learning. Ask tons of questions; most fellow artists are more than happy to help a newbie out, me included!
Big thanks to all my friends, teachers, and classmates who gave me awesome feedback and shared their knowledge with me! Thanks for the support! Thank you very much for taking the time to read the article! Cheers!