Alexander Sartig shared an enormous and detailed breakdown of the Shadow project, explained the entire process step-by-step, and talked about the tools used in this workflow.
Hi! My name is Alexander Sartig. I am a 3D Game Artist. After years of work as a Graphic Designer at Axel Springer SE, I decided in 2016 to study game design at the HTW (University of Applied Sciences) in Berlin, from which I graduated this year.
Throughout my studies, I continued to work as a freelance Graphic Designer and later as a 3D Game Artist. I‘ve worked on various game projects, such as “Ad infinitum” from the game studio Hekate. It‘s still in development and I‘ve been working on the project as a 3D Environment Artist from 2019 until today.
Shadow 3D Environment
My goal for this project is to create an environment that has something epic and monumental about it. It's supposed to have a dark and mysterious mood. I have the idea that the entire environment is very grim and is characterized by a strong light source with an interesting shape. To reach this mood I ́m planning to work with strong contrasts.
Another goal is that the entire scene is optimized for real-time despite the strong visuality and that it runs smoothly as a game. To achieve this, I will use various techniques that allow the computing power required to render the 3D scene to be minimized without reducing the visuality and the richness of detail.
As the project name „Shadow“ suggests, shadows and thus also lights are an essential part of my work.
I want the scene to be in the shadow of a large object such as a mountain. It should be a dark environment with a clear light source that characterizes the entire environment and is therefore clearly in the foreground. With this structure, I hope for a very aesthetic light-dark contrast.
To visualize this desired mood and atmosphere in advance, I researched images on the Internet to create a mood board.
My approach to creating Concept Art is to blockout scenes with rough shapes directly in Maya or in Unreal, take screenshots of them, and then doing overpainting in Photoshop. This technique has the advantage that I quickly get a feel for the space and size of the environment.
With this workflow, the concept phase is part of the blockout phase and therefore difficult to separate from each other. The concept artwork shown here was thus created at the end of the blockout phase. The result shows the concept of a millennia-old temple in the shadow of steep cliffs, that was built by an ancient culture and apparently once abandoned in a hurry.
In addition to the light-dark contrast, I work with a complementary contrast (blue/orange), which is also a cold-warm contrast.
With the landscape, I create the foundation of the environment. All of the following assets are located on the landscape and are therefore dependent on it.
The landscape sculpting tool in Unreal is very intuitive and you can quickly explore shapes and landscapes.
Since blocking out the scene is part of the concept phase, it is important for me to create the basic materials in advance in order to explore not only shapes and spaces but also colors in the blockout phase. For example, a white room feels much larger than a black room. It is therefore important to experiment with colors early on.
The first material I make is the master material and serves as the basis for all subsequent materials. Here I create the most important parameters to make this material as flexible as possible for many assets.
The Master Material (MM) serves as a parent for the Material Instances (MI) that are ultimately used on the assets and in which I can manipulate the parameters without changing the MM.
The second material I create is a very simple landscape material. Here I just layer 3 different materials that I created as Material Functions into one another, in order to later create a texture and color variance in the landscape using the Landscape Paint Tool.
The output of the 3 material functions MF_MySand_01, MF_MySand_02, and MF_MySand_03 goes both into the landscape material and into a runtime virtual texture, which I use to blend assets with the landscape later on.
At first, I use placeholder textures from the Quixel Bridge, which I will replace with textures I have created myself in the course of the project. The rocks are Quixel photo scans, which I can adapt and change according to my vision thanks to my materials. The dark rocks and light sand already create an interesting contrast here, which I will further expand in the next steps.
The Pictures below show the development of the blockouts in Unreal. For the heads of the statues, I used the character‘s head, which serves as a scale reference. Here I make the first adjustments to the light in order to bring the colors and mood in the desired direction.
For the entrance area, I needed a few tries and iterations to get a good result. First I planned to make this area very open with a narrow bridge that leads to the temple. In the course of the work, however, I decided to close this area with a huge gate and to do without the bridge.
After I blocked out the entrance area, I did an overpainting of the screenshot again in Photoshop and finalized my concept of the gate. With the end of the blockout phase, the concept phase also ends and I have a clear picture in my mind of which assets I need to create my environment.
The modeling phase begins after the concept/blockout phase and runs through the entire project. Even now I will explore different forms and ideas, but these no longer essentially differ from one another, since I now have a concrete concept in my mind.
I make base meshes, which exactly match my ideas of scale and shape, in order to process them further into a high poly mesh in a later work step with ZBrush. While creating complex base meshes like the head statue, I do not pay particular attention to the topology, as I will fundamentally renew them in the retopology phase. I just pay attention to the topology of simpler assets, which I just change slightly in ZBrush, so that I can use the base meshes also as low poly mesh for Unreal.
I make modular assets for the temple walls and ceilings. I created this in Maya in a grid so that the individual wall parts fit exactly next to each other. For this purpose, I always put the pivot point of the individual meshes in the outermost upper corner. This allows me to arrange the wall parts in a row in the game engine with the vertex snapping tool.
Other modular assets for this environment are the many different bricks I can use to assemble tile floors and steps in Unreal. In contrast to the temple walls, it is not important for the bricks that they snap together perfectly, as I am designing an ancient temple and the loose arrangement of small bricks makes the weathering by nature look more authentic
I import the base meshes to sculpt high poly meshes in ZBrush. In this step, I create organic shapes and sculpt details that would otherwise be very difficult to create in Maya.
I change the shape of the placeholder head and add distinctive facial features. I deform the nose so that it looks almost stylized. I also try to incorporate the shapes of the temple into the statue. The slit of light and the round opening in the temple can now also be found on the statue. I imagine that the ancient culture that created this temple, considered the light source and the forms that result from it, as a divine appearance and, to a certain extent, worship it and have built it for ceremonial occasions.
The high poly sculpts of the smaller assets with a high level of detail, for
later close-ups and renderings.
The high poly sculpts of the modular bricks with which I will later set dress the inner of the temple.
With the sculpts I add wear and tear effects on edges and corners, which I later bake on the low poly meshes.
Since the temple has an incline from the entrance to the light slot and the columns should be flush at the top, there are two sizes of the foot of the statue.
I also do high poly sculptures for huge objects like the rocks with the opening and the stairs. The Normal Map from the bakes is later added to the tileable textures as an additional detailed Normal Map.
I import the high poly models from ZBrush into Maya. Here I am doing a retopology with the Quad Draw tool. I make sure that the topology is very clean and that it provides good edge loops. These make unwrapping easier for me later.
I also do the unwrapping in Maya. In this step, the assets are prepared for the texturing. I “cut” the 3D models specifically in order to spread them out on a UV coordinate system. I will texture these 2D faces (UV shells) later. It is important to place the seams in places that are difficult or, ideally, not at all to be seen by the viewer.
I make sure to produce as few seams as possible and to spread the UV shells over the largest possible area of the UV map and arrange them sensibly. Since I plan to texture the vases. with a pattern that should be tileable, I make the UV shell of the vase so that it takes up a place from 0 to 1 on the V-axis. This ensures that the pattern on the vase tiles seamlessly.
In order to achieve an even texel density, I look at the assets with the UV checkerboard. In this view, I can see possible distortions of the later textures. Places that are less important and require few details can have a lower resolution than the obvious and more interesting parts of the assets.
I bake the information of the high poly meshes in Substance Painter on the low poly models. I bake the Normal Map, the Ambient Occlusion Map, the Curvature Map, and the World Position Map.
In Substance Painter, I work with a Wacom graphics tablet to apply colors and details such as small scratches or dirt to the assets by hand. Texturing is a lot of fun for me and I take a lot of time for this phase. Even with small assets, I pay attention to an aesthetic choice of colors with interesting contrasts and variances.
To highlight shapes and edges, I paint shadows and light effects on the objects. These light-dark contrasts make the shapes easier to read and give them more expressiveness.
Screenshot from Substance Painter. The left asset is without the baked maps and the right asset is with the baked maps.
To get a uniform look, I made my own smart materials for the most common materials (metal and stone). These smart materials contain all the layers required. This method is extremely useful, as it ensures a uniform appearance and saves a lot of time, which I can then spend on detailed work on the texture.
Left: By simply applying the “MyRock” smart material, I already get a good basis for further texturing. The high- lights of the Edges are still very strong and not final. Right: This picture shows the asset after I manually refined the texture
I texture extremely large objects like the entrance gate or the temple walls with a trim sheet. I start by creating a simple plane in Maya and divide it into different segments. In ZBrush, I sculpt details on it. I bake the high poly mesh in Substance Painter on a plane. The UV shell of which takes the place of 0-1 on the U-axis in the coordinate system. The result is a tileable trim sheet texture.
Now I can texture the plane with my smart materials. For this project, I designed a hieroglyphic font in Adobe Illustrator, that I placed on the metallic surface of the trim sheet.
I load the trim sheet into Maya and am now able to texture the assets in Maya. I unwrap the meshes and placing the UV shells in the places of the trim sheet that I want to see on the finished asset.
Including the trim sheet material, I have created 5 different tileable materials for this project. The other four materials, I created with Quixel Mixer.
The lineup of all the assets I created for this environment.
The lighting is completely dynamic and therefore not baked. Since my work is an environment for a real-time application, I would like to leave the option open to be able to change the light in real-time as well. With this method of lighting, it is conceivable that the light source (Sun, Moon) moves in the course of the game and the scene literally shifts into a different light.
It is a great challenge to artificially expose a night scene that looks believable. On the one hand, it should of course be dark and radiate a nocturnal atmosphere, on the other hand, the environment must have a certain brightness in order to be tangible and visible for the player at all.
To do that, I use several directional lights. I don‘t have any baked Global Illumination (GI) in this scene, nor do I use Raytracing GI. Global Illumination is indirect light and is created by the bounces of the lights. In order to have the best possible control over this indirect light, I fake it by replacing it with directional lights that shine from bottom to top. I can now edit the fake indirect lights with color and intensity tailored to the environment.
I also illuminate areas that are too dark with point lights or rect lights. I also use point lights to highlight certain assets that I want to emphasize in the scene, such as the relics in the heads of the statues.
In addition to the light itself, the exponential height fog volume is very important as a lot of light comes through the fog. In addition, there are small fog and cloud effects that I place with Fog Cards and God Rays. These are essentially the only planes on which there is a cloud texture with an alpha channel for the opacity mask and an emissive value. I got the Fogcards and God Rays from the Unreal project Megascans Goddess Temple, which is free to download from Epic in the Epic Store.
Another challenge is that the settings for the interior light and the exterior light cannot be the same. Every time I change the lights for one of the two sections of the scene, it no longer looks good for the other section. For this reason, I edit both parts of the environment with the same method, but with different settings and separate lights.
To get a transition between the two light settings during the game, I place a trigger box in the narrow area in the entrance area. As soon as the player character enters the inside of the temple, he collides with this trigger and thus switches the exterior light off and the interior light on.
Screenshot of the World Outliner in Unreal with the folder structure of the project. The Light folder is expanded and you can see the various lights for the interior and exterior sections:
To make the whole environment more organic and less sterile, I attach great importance to visually connecting and merging the meshes with each other. Vertex painting is well suited for this.
The first screenshot shows the area where the stone wall and rocks meet. You can clearly see where the boundary between the assets runs.
The same area looks much more organic thanks to the vertex painting on the second screenshot. The transition between rock and stone walls can only be guessed at.
Runtime Virtual Textures (RVT) are ideal for blending assets with the landscape. This method is cheap, looks good, and, unlike vertex painting, works in real-time. With vertex painting, I have to switch between materials manually. As soon as I move the asset, I may have to manually correct the vertex painting. RVT Blending updates itself when the assets are moved. This makes it easier to quickly relocate the objects.
I created the master material for the RVT Landscape Blending with the help of a Quixel guide for RVT Blend. The texture for the noise mask comes from the Epic project Megascans Goddess Temple.
Left: Without RVT Blend. Right: With RVT Blend
Decals ensure a higher level of detail and subsequent color variations. Especially for objects such as the entrance gate, which is textured with a trim sheet, the addition of decals has a positive effect.
For this project, I am making six different decals. In addition to roughness and color information, three of them also have normal information. These decals with normal maps are created as High Poly Sculpts in ZBrush. I sculpted cracks and breaks on three of the six sides of a cube. I bake the sculpts on a plane in Substance Painter to texture them. For the decals, I create an Opacity Channel in Substance Painter and mask everything around the crack.
The opacity information comes into the alpha channel of the ORM map. After exporting the textures, I create a decal material in Unreal and, as usual, expose the common parameters such as color, roughness, normal intensity, etc. in order to be able to vary them flexibly in the material instances.
Without and with Decals:
In this phase, I artfully arrange all the assets and decals I have created in the scene. I make sure to incorporate narrative elements and tell a story with the objects.
I want the viewer to feel that it is a holy place that once meant a lot to the people who built it. Through the arrangement of the small props, the player should notice how this place was busy at an earlier time.
In the set dressing phase, I also fill the environment with vegetation and small stones, which I place in the scene with the Landscape Foliage Paint Tool. These plants and stones are photo scans from the Quixel Bridge.
With the dressing set, I also create a Point of Interest (POI). I will use these POI ́s later for close-up shots for image renderings. The POIs get additional lighting to make them even more exciting. For this, I use 3-point lighting, which is also used in photography.
I want a cinematic presentation of the scene. To do that, I record this film from several shots with the Unreal Sequencer. I render the shots at 30 FPS to get the feel of a movie. Then I edit the shots slightly in Adobe After Effects and add subtle and atmospheric background music (title: Dying soul). The sound comes from YouTube and is freely available.
After that, I ́m doing image renderings with the Movie Render Queue in Unreal. To give the scene a more epic and cinematic feel and a bit of narrative, I place a character in the environment, which I bought from the Epic Marketplace.
I kept an eye on performance throughout the development process. In order to create a good experience for the player, it is important that the application runs smoothly and reaches at least 60 FPS while playing.
In order to achieve a good performance, I have used various techniques as described previously. These include the high-poly-low-poly workflow, with which I keep the polycount in the scene. I set objects that don‘t move to static. As a result, the light information is stored in the cache and dynamic light is not constantly recalculated as long as the position of the lights does not change.
For dynamic ambient occlusion and shading, I also use mesh distance fields. For this purpose, the position of the static objects in the environment and in relation to one another is saved in a volume texture. This is loaded before the application is started, so real-time performance is not affected. Runtime virtual textures, for effects such as landscape blending, are also loaded before the game starts and are therefore cheap during use.
The Unreal Engine offers automatically calculated Level of Details (LOD) of the imported meshes. I determined the number of LODs individually for each asset in order to achieve the best possible result.
I also make sure to keep the draw calls low by combining objects that consist of many smaller objects into one larger object. An example of this is the entrance area, which only represents one draw call, or the staircase assets, where the entire staircase is rendered in one piece and not every single step forms its own draw call.
Of course, Lights also have draw calls. I keep the number of simultaneously rendered lights low by assigning each point light in the scene its own draw call distance. With this, I make sure that expensive point lights are only rendered when the viewer is close enough to see their effect.
I wanted to create a dark and epic environment with a strong light source in the center and started working on the scene even before having a setting in my mind. This breakdown looks pretty straightforward in terms of planning, but it took me several tries to come up with a concept that would fit my desired mood. In retrospect, I would say that it would be wiser to think about the setting early on. However, this was my biggest environment project so far and I am very happy with the result. I learned a lot during the process and had a lot of fun creating this scene.
Thanks for reading my breakdown! If you have any questions or would like to see my other works, I would be happy if you contact me or follow me on my ArtStation.