Andrew Harrington showed how he produces stylized tiling textures with ZBrush, Photoshop, and Substance Painter.
Ahoy-hoy everyone. I am Andrew Harrington and I am a Lead/Senior Environment Artist. Throughout my time in the industry, as I worked at many studios, I have been able to learn from and be influenced by hundreds of individuals. In the article, I hope to share some of my knowledge and my process of how I go about creating stylized environment textures.
Specifically, I will be going step by step over my process of creating the following tiling texture.
The first step I do when creating any environment tiling texture is to either draw it out in Photoshop or block it out using flat geo in Max or Maya. If I draw it out in Photoshop, I make sure that it tiles and then I use that as a guide to block out my flat geo. I typically work on an 8mx8m plane because in most cases it will provide the appropriate texel density for use in the game and I can better judge the scale of details in my texture compared to the size of a character.
Once I have my geo blocked out I decide what parts are going to tile over. I typically work right to left and then top to bottom and have my upper right piece as the “4-corner” piece.
Now that I have the tiling figured out it is time to extrude the edges of each block so that I have an edge to sculpt on. It is really important that I don’t extrude the edges straight down at 90 degrees but flare them out and have them overlap the edges of the blocks. This will ensure that I don’t get any negative space when adding edge detail and it will allow me to take away as much of the edge as I want.
The last thing I do is creating an 8mx8m plane and centering it behind my blockout geo. This will be the low poly plane that I will project my high poly mesh onto when I bake out my textures. It will also help me when I go to tile my subtools in ZBrush later on.
Finally, I grab everything including the 8mx8m plane and export it out as one .obj to bring into ZBrush.
When I bring my base mesh into ZBrush it is all one piece. I’ll want each element of the texture to be broken out into its own subtool so that I can sculpt on it individually and crank up the subdivisions without having a big impact on my performance.
The first thing I do is run and “Auto Group” under the “Polygroup” Tab. This will give each element its own group ID and allow me to split them out into their own subtools.
Under the “Subtool” tab, I will then run “Groups Split” which breakouts each element into its own subtool.
I will then select each subtool and run DynaMesh on it to retopologize it, then smooth divide it to either 4 or 5 divisions. That should be enough resolution to add nice detail.
There are many ways to add surface detail that will give you a stylized look. The main idea I work toward when adding surface detail is to give enough information to understand what the material is made of but not too much to avoid making it overly noisy. As one of my Art Directors used to tell me, “Sometimes less is more”. For this piece, I used a method of adding a bunch of detail, then taking them away. I would start with the ClayBuildup Brush to add the detail and then go in with the Planer Brush to take it away.
Note: Using a Square alpha with the Planer bush will give you nice sharp edges. I will then use the TrimSmoothBorder brush to add a bit more definition.
This method works well for this as it gives a nice clean surface with hints of details.
I repeat this method with all the other subtools. Once you do it a few times. the process goes pretty quick. I make sure to pay extra attention to the edges of the blocks. I want them to have a lot of angles so they give more depth. Without them, the texture will look rather flat. I also constantly check the overall look of my texture at a straight on camera angle as this is what it will look like when the texture is baked out.
Once all the subtools are sculpted out I want to add a bit of variation in their rotation and depth to give an extra layer to the texture. I don’t adjust all the subtool though, just a few. If I adjusted all of them it would look pretty unorganized. The variations help to lessen the effect of repeating elements when the texture is tiled.
At this point, I am ready to tile my texture in ZBrush 2.5d.
Tiling in ZBrush
The first thing I do when preparing to tile my geo in ZBrush is to make sure that my document size is set to the same size I want my texture to be. I do this so that when I grab the heightmap with the correct size from 2.5d. Under “Document” I set the size to 2048×2048.
I will then drag my Ztool onto the canvas and select the 8mx8m plane subtool that I exported out of Max with my base geo. Having that selected, I make sure that Dynamic Perspective is switched off, then frame my subtool. ZBrush will frame to whatever subtool you have selected so this is why I used the 8mx8m plane. This way my Ztool fits perfectly within the document size.
With my Ztool framed I can now duplicate the subtools on the edges and then offset them to their opposite sides. If the offsets are not pixel perfect that is ok, I will fix the seams in the next step.
Next, I drop my canvas into 2.5d. You can scroll the texture by holding the “`” key or you can more accurately offset the canvas by going to the Layer Tab and adjusting the “Displace H” and “Displace V” sliders.
Since I know my canvas is 2048×2048, I know that if I offset both H and V by 1024×1024, all the seams will be in the center of the canvas.
With my seam in the middle, I will grab the height map of the canvas by using the “RGBZGrabber” under the Simple Brush options and then clear the canvas by pressing “Ctrl+N”.
I will then use that same 8mx8m reference plane from Max as a high poly mesh to displace geo based on the heightmaps I just grabbed. With my 8mx8m reference plane subdivided, without smoothing, to about 4 million points and my heightmap selected as the “Current Alpha”, I “Mask by Alpha” in the Masking options. This will project my alpha mask onto my 8mx8m plane.
Then I will offset the geo by adjusting “Offset” under the Deformations Options. I typically only adjust the offset to about 5 or 6 as I don’t want a super strong displacement.
I can now clear my mask and polish out any seams. I will repeat the 2.5d steps until the seams are completely removed. Once that is all done, I will export out this geo as my high poly mesh and use the original 8mx8m reference plane as my low poly to do my bakes.
For me, the texturing process is the step where I probably spend the least amount of time. I like to keep things pretty loose and simple when working on stylized pieces as I find it helps to make it more readable in game.
I like to have things a bit organized when I start texturing, so I use the legacy DDO plugin for Photoshop to help organize my layers. I only load in the base Normal Map into the plugin and replace the AO and Curvature maps.
When I have the base layers all set up with my baked textures I fill the different elements of my texture with a solid color that is close to the color I am looking for.
It is super important that I set all my color values to work with Liner Rendering (Unreal 4, CryEngine, Marmoset etc). In Liner Rendering, mid point grey is not 127,127,127 but more like 187,187,187. Far too often I see textures that are way too dark and have to be compensated by blowing out the lighting in a scene. An inherently dark texture does not receive light well, so do yourself a favor and keep your color ranges in the upper values.
It’s now time to start layering on some brush strokes and subtle color variations. To do this, I grab a simple pattern brush. In the Brush Properties, I enable the Color Dynamics settings, turn off “Apply Per Tip and give slight values to the Hue, Saturation and Brightness Jitter. Now every time I make a different brush stroke it will pick a color within the ranges.
One more thing to note, I make sure that the flow and opacity on my brush are both set to 50%. This way I can build up the different colors.
I then layer on some smaller subtle details and play around with different color variation using a layer adjustment.
The final step is to use this as a base color texture in Substance Painter and layer on some effects and generate my Metal/Roughness Maps. I keep it pretty simple in Painter, as I don’t want to add a bunch of noise. I am mainly looking to add some information to the Roughness Map and some slight grunge. I like to use the “Bone Stylized” for its Roughness information and then add some color to my AO dirt map to have some fun with it. That is pretty much it. Like I said before, sometimes less is more.
My rendering setup is pretty basic inside of Marmoset. I have a three point light set up using Child Lights from one of the Environment maps. Because I used high ranges in my color values when texturing, I am able to get a lot more out of my lighting without having to blow everything out. As said before, it is very important that you use correct color values.
I hope that you have enjoyed getting an inside peek into my process of creating stylized textures. My knowledge and skills are a combination of learning by watching others and A LOT of trial and error. The great thing about stylized art is that there really is no right answer, just have fun with it. Thank you!
Andrew Harrington, Lead/Senior Environment Artist at Airship Syndicate
Interview conducted by Kirill Tokarev
Simple River Stones by Stan Brown is a procedural material for your environments fully made in Substance Designer. The package includes a fully commented and organized graph for study and customization.
Any future updates are included and will be available for download in case they are released.