Math Roodhuizen talked about the workflow behind the Tishen's Well project, told us about the creation of modular assets, and discussed the creation of the polluted water shader.
Hi! My name is Math Roodhuizen. I live in The Netherlands and studied Game Art at the HKU, University of the Arts Utrecht from which I graduated in the summer of 2018. In early 2019 I got hired at a VR studio in Amsterdam called Force Field XR. There I started as a 3D artist on a smaller project called Anne Frank House VR. After that, I worked on the Oculus Quest version of Star Trek: Bridge Crew.
Since then I have been working on things that haven’t been announced yet. I still work at the same studio, which is now called Vertigo Studios Amsterdam.
The Tishen's Well Project
I started this project during the Modular Environments course on CGMA, given by Clinton Crumpler. I wanted to make sure this project wouldn’t get too big and to keep it manageable time-wise I decided I would go with a smaller, enclosed space. Ancient cultures and buildings like temples and shrines have always interested me. I like to think about the story that shaped the environment, and I wanted to go into this project with a background story in place and design everything around that.
Around the time I started this project, I re-watched the Blade Runner movies. In Blade Runner, the ecosystem has collapsed and in many places, you can still see the remnants of the time before the collapse. In a lot of places today, though not as dramatic, you see something similar happening: traditional-looking temples surrounded by highrise, billboards, and electricity poles. I wanted to create a similar contrast in my environment.
Another big inspiration for this environment are structures called stepwells. In particular, one is called the Adalaj Stepwell in India. As the name suggests, these structures are big wells with steps that go down so people can collect water from them as the water levels rise and fall with the rain.
I came up with a fictitious place inspired by these wells. I started writing a simple background story and creating a sketch of what I had in mind.
In short, the environment is a small temple located underground, beneath a large city. The temple was built at a time when the people from this town followed a religion that was all about being in balance with nature. Society, however, industrialized and the people no longer follow these beliefs. I wanted to emphasize the contrast between the old beliefs and the current society in this environment.
Early on, I made the conscious decision to go with a basic composition with a central element. I started with a simple blockout. This part of the project is all about getting the general composition and shapes of the environment right. I wanted to see what the scale of the environment would be and how many assets I would roughly need.
I wanted the statue to be the central element in the scene, with the light coming from the opening at the top, illuminating the statue to pull extra focus to it. Early on, I put a rough version of this statue in the environment to see how it would feel. I played with some different looks. In the end, I went with realistic proportions, but I stylized and exaggerated his facial features. The way the bounce from the main light showcased these features was something I really liked.
Setting Up Polluted Water
Besides the statue, the well in the center of the room is also an important element. It tells a lot about what the function of the environment was. The well being very polluted also has a symbolism that I liked. The statue and the polluted well show the contrast between the past and present quite clearly so I wanted to make sure the well was done properly.
First, I wanted to try out the ‘single layer water’ shading model. If you select this shading model in the material editor, you will get an extra output node. The nice thing about this shading model is that it uses real-world values and physics to simulate how water absorbs different wavelengths of light, which will change the color the deeper the light penetrates the water. For example, the water could absorb more red light, in turn changing the color you see the further you go down. I will not pretend I know exactly what is going on here – what is important for us as game artists is that we know how to work with it so we can get the desired result.
Ryan Brucks, an amazing tech artist over at Epic Games, explains it way better here. He also shows how to work with the absorption coefficient, which will make a ton more sense after you have heard his explanation.
I simply started with applying the values that would give me a correct result for pure water. After this, I started tweaking the values to try and get the look that I wanted. I didn’t really want to go for muddy water, but I did want it to look stained. Imagine an ashtray with some cigarettes in it left outside when it’s raining, the water is still relatively clear but has a distinct coloration. This was the look I was trying to go for.
The water turns darker the deeper you go and the more light it absorbs. I wanted to push this sense of depth more and added some trash both near the surface and further down. This helps sell the depth better and makes it more believable that the water is stained in the first place. In the material for the trash itself, I put in functionality to blend in a dark tone using vertex color so I can reduce contrast. I also used a world-position offset to make it wobble on the water surface.
For the water surface itself, I created a mesh that would allow me to scroll a texture in one direction over the UVs, but have the texture move from the inside out on the mesh. I used vertex colors to mask out/fade out the scrolling texture.
As a final touch, I added a decal for the water spilling over the edge, and another one for where it hits the floor.
As you can see, to get the desired effect, as is often the case with things like this, several different elements need to be combined to get a convincing look. At the same time, I had to try and look at the well as a whole and how it looks in the environment and make sure I didn’t go overboard with any of the individual elements.
The majority of the environment is set up in a modular way. I started with the blockout and tried to translate the block-out to modular pieces first. I aimed for a pixel density of 2048 pixels per 3 meters. Here, I also started to plan out my trims.
I had a look at how other people divided their trim sheets. How much of it was fine detail? How much of it was larger shapes? Based on some references and my own needs I came up with this layout.
After this, I created a simple blockout that I could take into ZBrush and start sculpting.
I put the UE4 mannequin in there to give myself a sense of scale and make sure the individual parts of the trim sheet retained a proportionate size. The patterns are roughly based on references I found, in particular photos of the Adalaj Stepwell. Based on these photos I created some alphas in Photoshop, which I then imported to ZBrush where I used them to create the patterns.
I baked all of this down to a plane in Marmoset and textured it in Substance Painter. I went back and adjusted the textures multiple times before ending up with the current look.
The majority of the assets that make up the structure were textured using this trim sheet. I added other assets like small plants, rocks, piles of dirt, and some electrical equipment to break it up and add some variation.
When thinking about what other assets to add, I went back to the concept. Some of the people living directly above might know of the existence of this place. I thought that people might use it to stow away electrical equipment like transformers, perhaps because there is no more room at street level. The room would sometimes partially fill with water though, so that’s why none of them are on the floor and they are all elevated.
I thought of other ways people might have used this place. Maybe someone who has lived on the streets took shelter here for a while during a rainstorm. I created a mattress and some generic trash assets that people would have thrown down here as the streets above got too cluttered.
The pipes are made as a modular set. I made a simple set of smaller pipes and some wider ones. I thought about using Houdini to create a tool for this, but in my case, since the environment is not that big and I’m new to Houdini it would have probably taken more time to create a Houdini tool for it than to snap together the modular meshes myself. This was not the case for the cables though, since they all have their own length and arch in different ways. Based on some tutorials online I created a simple Houdini tool that allowed me to set a start and end-point and allowed me to set the thickness and arch of the cable. This helped me speed up the process and was a nice learning experience.
Vertex-Paintable Water Puddles
Using vertex paint inside UE4 or any game engine can be very beneficial, and it’s up to you how you want to use it. You can access vertex color data by simply using the ‘vertex color’ node in the material editor. This node gives 4 outputs, red, green, blue, and alpha. This node will use the vertex paint data you apply on the mesh in-engine, which are values from 0 to 1 for each channel. For the floor, I created a high poly sculpt that I baked down to a plane. When baking, you can also bake a Height Map. A Height Map simply is a Greyscale Map that uses black and white values as Height information.
In my case, I wanted to use vertex paint to paint in water puddles. However, in reality, puddles would form on the lower parts of the floor, for example, the creases and cracks. This is where the heightmap comes in, which you can use in combination with the vertex paint to mask in the water. In this case, I masked in an adjusted color, a smoother roughness, and a flat normal (to get the flat water surface).
I put all this stuff in a material function, which is hooked up in a way that will make things more confusing than they have to be if you are new to using node-based shader editors. A few years ago I wrote a very simple introduction to using vertex color in combination with a heightmap on my blog. If you’d like to try something like this for yourself, feel free to check it out!
The Graffiti Material
I wanted to add graffiti tags to add some splashes of color. I could have created a bunch of tags all in different colors to achieve this. However this would have been quite time-consuming and it didn’t seem very efficient to do it this way and create, for example, 20 different textures, materials, etc. With meshes, you can put a bunch of different things on a single atlas and simply export multiple meshes that are mapped to different parts of the UVs. With deferred decals in UE4, this is not possible in the same way. You can, however, create the material in a way the decal only uses a small section of the UV space, and then you can offset this to use different parts of the texture. I put the tags themselves in the alpha channel and the colors in the RGB channel of the same texture. Then, in the material, I use only a small area of the texture so that only one tag is visible. I offset this for each tag to show a different one! Simply do the same thing for the color channels, but with a different offset. You can then combine the two and change the offset per tag.
To determine the offset I used the Actor Position node in the material. This node takes the world position of the actor which you can use in the material, in this case, to offset the UVs. There was a forum post somewhere that inspired parts of this but I can’t find it anymore – if I come across it I’ll make sure to comment it down below.
Lighting and Rendering
Quite early on I had a clear idea of what I wanted, but it took me quite a while to get the right look. I wanted the scene to look a bit muted, without being too bland. Ideally, it would still feel quite serene, like a temple, and not too gritty. This would contrast nicely with the more modern elements like the rusted pipes and trash.
When playing with the lighting I often found it too harsh and contrasty. Adding a bit of fog helped but quickly became too much. In the end, I turned the fog down and hand placed some elements where I did want a bit of fog for added effect. The god-rays at the top for example are mesh cards. This had the added benefit of being able to put some subtle animation on it and I had far more control over the intensity of them. The same goes for the patches of fog next to the statue. These were also hand-placed and use a special material that allows me to make it brighter closer to the statue. I did this so I could again have more control and really focus the composition around the statue even more.
For post-processing, I didn’t go overboard. I added some screen space AO and balanced the color a tiny bit. This was necessary since the same trim is used everywhere, the bounce lights had the tendency to shift all colors towards the same green-yellowish hue in the light bake. I added some subtle blue tones to the shadow areas to counter this. I also pushed the saturation in the oranges some more so that the statue would stand out against the green background.
The initial course took about 8 weeks. I did not finish it within this time and combining it with my job was quite intense. After 8 weeks I took a break and returned to this project with a fresh mind. This is when I feel like I managed to push this environment from something I was a bit burned out on to something I really liked. Feedback from Clinton was a great help during the course. Around the time when I was wrapping this project up, I also received some good feedback from some colleagues that helped me improve it further.
The biggest challenge for me personally was probably the lighting. I went back and forth a lot and did not succeed in getting a good lighting setup at an early stage. In hindsight, I wish I put a bit more focus on getting the atmosphere and lighting earlier. Lighting can really make or break an environment and at the same time is one of the easiest things to get tunnel vision on. I would often tweak the lighting for an hour, only to completely hate it the next day. Looking back I would say I should’ve been more methodical in setting up my lighting, and use more references. This way I would have been actively working towards something, instead of aimlessly trying things out.
Overall this project was a great learning experience for me. I glossed over many things to keep this interview from becoming too lengthy. If anyone reading this is curious about something that wasn’t explained here, feel free to drop me a message on ArtStation or Instagram.