Making a Cel-Shaded Porta Potty in the Borderlands Style

Making a Cel-Shaded Porta Potty in the Borderlands Style

Matthew Messner did a breakdown of his stylized prop Porta Potty made in ZBrush, MODO, Substance Painter, and UE4.


Hi everyone, my name is Matthew Messner and I'm a 3D Environment and Prop Artist from Austin, Texas. I attended Vertex School for environment art and I'm currently on my first game project with Bad Rhino on contract. I could tell you what I've been working on but then a giant orange rhino would blast through my office wall and gore my secret stuffed brains across a two city block radius. I've always been a massive nerd for 3D art in video games, film, and collectible sculpture design. Around two years ago I decided to stop spectating and got serious about wielding my Wacom pen into the polygon colosseum.

1 of 4

Porta Potty: Idea and Reference

I have a print design background and I've always kept my art skills sharp by working on projects with varied styles. I've been trying to apply this philosophy to how I approach personal 3D studies. Hand-painted game art can be incredible and I've been neglecting my pen and ink abilities these last few years. Trying to approximate the look of Borderlands 3 while adding my own signature touches seemed like a worthy challenge. Kill cake with two birds and eat them as they say.

For references, I didn't do anything that fancy. The original masterfully made Porta Potty by Paul Presley really stuck out during the Porta Prison side mission. A good place to start was image searching "Porta Prison" for screenshots. I loaded up Pureref and dumped a load of images of the prop into it. I also browsed through Gearbox Art Blast to get an idea of what styles of inky lines and distressed splatters made their way into the title. I did try to find the original concept drawings to see what Paul had worked from but came up empty. Looking at other pre-production pieces from the game did clue me in on some good approaches for this project.

Modeling in ZBrush and MODO

Before I started I knew I wanted to use Unreal 4 and get close to the same scale as the original game model. I wanted to use a single 4K texture map and I most likely needed a type of shader for the comic ink effects on the outlines of the model. More details on the last part later, but I watched an informative tutorial about this before I started modeling, so I did know that the later post-processing effects would benefit from having details added to the surface normals. This informed my approach of how I wanted to model this.

To begin, I created a new first-person level in UE4 and as I typically do when first modeling an asset, blocked it out in engine. I then used the Bridge plugin to transport it into Modo at the correct scale and then used the GoZ kit in Modo to send my model into ZBrush. I do this to easily keep everything uniform across all software in my workflow. From this point, I've found that I don't need to work in Modo until I'm finalizing my low poly. This method also offers a quick way to see how a decimated sculpt is reading in Unreal with just a few mouse clicks.

I created everything for this high poly in ZBrush. Once my reference images are set up on the floor grid I start putting all my pieces into place. I took note of which portions of the model should be mirrored at this point. I wanted to keep this as optimized for a single map as possible and reduce how much hand painting I would need to do later down the road. For the most part, it was pretty typical sub division poly modeling "The ZBrush Way," just primitive shapes and placing edgeloops with the ZModeler tool. Qmesh.. transpose.. repeat. When I'm creating hard-surface in ZBrush I try to use this method as long as possible to help with retopo later. When a part of the asset is ready for a final level of detailing (hand-sculpted surface wear, cracks and cuts, etc.) I duplicate that polymodeled version of the subtool into Modo at its lowest subdivision level to stay organized and as a backup measure.

A tip for beginners at this point: use good naming conventions for your subtools and keep things in folders that make sense to you. We've all been there, you start haphazardly duplicating a few dozen subtools named "Recovered_Tool" and "PM3D_Cube3D69." It can be a mess. Prevent punishing yourself later.

There was one exception to this model where I didn't use a primitive/edgeloop technique. This is why my brain likes to use ZBrush modeling vs other modeling packages. I could have done this a half dozen other ways but I chose to use ZSpheres for laying out the corrugated tube of the septic system and the strings that hold the dice to the exhaust pipe. I like the iterative control this gives me for modeling details like tubes and rope during the early stages of asset creation. Once I had the ZSpheres in their final positions, I created a unified skin that I could use for subdivision modeling.

Now I had all my subtools ready for some detail sculpting. For things like edgewear, I tend to use Dynamesh with good amount of resolution and I alternate between different types of trim brushes. If I'm going for realism I switch up the brush type and alphas from time to time to create more randomization but in a stylized model, I tend to stick with one alpha and the trim dynamic brush because the uniformity is acceptable. When I'm detailing in things like cuts, paneling effects, and screws holes I like to duplicate the subtool and ZRemesh it, then give it a few subdivisions to reproject the Dynamesh model onto. I've found that brushes like Mahlikus' MAHcut brushes and Michael Vicente's Orb Cracks and Slashes work best on a mesh like this.

After all of the parts of the model have received their proper level of detailing I send the high polys into Modo to meet back up with their lower poly versions. You may need to delete or freeze your subdivision levels or make a Polymesh3D version of your tool before you do this. GoZ will send the subtool at its lowest subdiv level to Modo if you don't. Make sure to create a duplicate of this subtool if you want to keep a version with editable subdivs. Note that sometimes to optimize the Modo file size and reduce your bake times you might want to consider decimating your mesh before sending it to Modo. Typically a decimation percentage of 50% works really well for preserving the detail I need for baking. As your high poly meshes make their way into Modo you want to change the mesh type to "Static Mesh" so they are easier to work with and reduce their memory consumption.

Retopology and UVs

Retopology for this project was pretty straight forward. My tool of choice has been Modo for awhile now. I like Modo because of the retopology pen tool. It works really well for adjusting vertices on the low poly and is an awesome tool for building a low poly model over a high poly mesh when creating topology for organic props. It's my personal preference over quad draw in Maya. I find it to be superior.

In the instance of this project, I worked in a relatively "low to high" method so my low poly meshes were already very close to what I needed for a final low poly. Just bits of tweaking distances here and there, removing the unnecessary edgeloops and creating a few beveled edges on portions of the model that needed extra geometry for normal map detail on the baked texture.

My next task was to assign materials for all of the individual parts of the model that I wanted to paint separately. This project had 14 in total. This makes it easier to hide portions of the model and access interior parts of the model when I'm in Substance Painter. Once I have all my final low poly meshes I double-check that the low and high poly meshes are named properly for baking by "Mesh Names" and then I send the low poly asset to RizomUV for unwrapping.

I really like Rizom's toolset for quickly creating UV seams and object alignment and it has a great unfolding and packing algorithm. Because I knew I wanted to texture this with Substance Painter, I could be a little more carefree with my UV shell distribution versus painting this in Photoshop where arranging the UV shells requires more user-friendly clarity. I managed a few of the UV specifics by hand but I let the software do a lot of the packing work. With some tweaking, I was able to get an overall 87% use out of my UV space which seemed good for only wanting to use a single map. I may have been able to optimize further with a bit more fine-tuning but I wasn't sure the time trade-off was worth it in the end.


While there are plenty of great toon and cel-shaded games, the Borderlands series still manages to stand out with its own recognizable look. The style reminds me of Geoff Darrow's comics and early Jamie Hewlett's Tank Girl which is no small feat for a game. The amount of work that art teams have put into these titles is impressive. Now that Substance Painter will allow you to import Photoshop brushes it was an easy decision to use it as a tool for this project. Being able to combine good drawing and painting tools with SP's layer and masking functions was pretty powerful.

I started out by baking my "unmirrored" version of the low poly model in SP to reduce the risk of any odd baking issues. I ended up baking parts of the model at a few different distances this way I could merge together the cleanest bake possible. The tight spaces of the inset portions of the model didn't like the same distance as raised bumps so this was necessary. I was able to merge the best-looking versions of each bake with Photoshop in just a few minutes because only a few of the UV shells had these problems. I reimported those merged maps into SP to check that everything looked good. Then in Modo, I mirrored out the portions of the mesh that needed duplication and exported this as my final game-ready model. I created a new project in SP and assigned those prebaked maps to each material of this updated mesh. Now we start texturing!!

I experimented a bit with some brushes to see which would give me the look I wanted to go with. I settled on a combo of a few of Kyle's Manga brushes. I established the most significant landmarks on the model that I had already predetermined during the sculpting phase. It was actually very similar to inking over pencils when making comic art. After I had put down a good percentage of the inks I wanted to see some color on the model.

The color fills are relatively basic and the entire model is textured with five distinct material types set up as Smart Materials. For example, the warm orange painted metal was four fill layers with solid color fills and slight variations on their roughness. I used different layer blending modes to combine the masks that each had their own grunge maps. The cool colored dark "plastic" parts were filled with a slightly more complex setup because they included more color variations, some subtle splatter and scratch masks, and an edge highlighting effect driven by the underlying baked curvature map. The random rust spot effect was actually a material I quickly put together in Substance Designer. It's a very simple setup of a slope blurred dirt map going through a gradient node. I pushed the stylized look of that material further by adding a sharpen filter when I added it in Painter. The mud effects were a masked color fill with a 3D linear generator applied, a few grunge textures and a sharpening filter.

Once I had defined the five main material areas on the model I did a final paintover. I used a few different brushes but I did tend to favor the Basic Hard Pressure brush. The paintovers were fill layers with paint masks. My paintover philosophy was to create a "shadow" with a darker version of the main fill color that was layer blended with a multiply effect and a "highlight" layer with a lighter version of the fill color and a lighten blend effect applied. I used these paintover layers to emphasize edges, shadows, and create effects like bullet holes.

My color pallet was based on the original Dahl Porta Potty featured throughout the Borderlands series. I varied the color slightly but I wanted the project to be instantly recognized as the "Borderland's toilet" so I didn't deviate far but I tweaked a lot of aspects to make it my signature version.

Setting up the project with 14 different materials does have a major drawback. At this time exporting a "merged" texture sheet across all materials sets is not a simple procedure in Substance Painter. To remedy this, I exported out each texture set. I then created white fill layers and added black masks as a new top layer for every material set. In the mask layer, I included every UV shell for each particular material set. These fills were exported as bitmap masks. I then created a new SP project with the same mesh. I created 14 fill layers for each of the original texture sets. The fills of these layers included their corresponding Base Color, Roughness, Metallic, Normal, and AO maps from that first export and I used the exported mask files to separate the shells with a bitmap mask for each layer. This new texture was exported and used for the material in engine. Kludgy but functional.

The material shader setup for the asset in Unreal is simply those exported 4k texture maps plugged into their proper nodes and a mask I made to turn on or off the emissive portion of the window on the front door of the toilet.

Toon Shader Setup

I honestly wasn't sure where to start the setup of my own post-process toon shader for this. I greatly appreciate the work Epic does to provide such excellent resources to developers. All credit is owed to Tom Shannon for his fantastic explanation. It is really worth a watch:

The basic idea is that you're telling Unreal to compare the distance from the camera to a pixel and compare that distance value with the value of its adjacent pixels. When it recognizes a large difference between those distance values it determines that it is the edge of an object. It also has a second part of the shader that does a similar comparison in the height values of an object's surface normals. These values are used to create a mask in the emissive channel with which you can define the size of that mask in the four directions around each pixel on screen. The color, thickness, opacity, intensity of the emissive, or even skew of the overall direction of the "edge outline" is customizable in this setup. That of course is only the beginning because you could drive a lot of different information into this masked area to create flickering and pulsating effects, change the color over time, gradients, and so on.

There would be a lot of creative things you could do, not all of them as easy on the eyes or as functional as an inked comic style line though. A lot of opportunities to create headaches and try to make someone barf. I found an additional solution to prevent your skybox from being included with this post-process effect as explained in another great tutorial by Youtuber underscore (see below). They go in-depth about ways to fix the skybox issue with Tom's shader setup and they also have some really great info for developing additional cel-shading effects if that's something you wanted to explore.


When presenting work, I've always tried to simply create a basic studio lighting setup in Unreal. My environment work tends to end up in UE4 so I like to present my art just like it would ship in a product.

To properly light this model I've front-lit the item with four slightly warm rectangular lights and angled them to get create some interesting shadows but still properly show off the majority of the prop. I didn't spend all that time inking and painting to not show it off. I also have the model lit from the rear with two cool colored lights. The asset is set in front of a curved backdrop mesh that I modeled. This naturally creates a subtle gradient background for presentations. I took two screenshots in engine for each pose to give myself a few options, one with a comic style parallel line texture which I made and applied to the backdrop mesh, and another where the material is replaced with a green screen type material I built for easily keying out the backdrop.

1 of 3

I didn't do much as far as post-processing for this project goes. The only changes I made from the default UE4 settings were applying the toon shader as a post-processing material and adjusting the scene's directional light by decreasing its intensity. Other than that it's a default Unreal FPS template.

While creating the final presentation images in Photoshop I decided to combine multiple shots of the prop from different screenshots in the same image. So I used the screenshots I captured with the green screen style background. I reused the striped texture I created for the backdrop as a static background for these final images and simply keyed out the green. No other alterations were made to the screenshots. The image border was created with a few different ink brushes. That's it.

The turntable video was created from two captured clips of the asset rotating in Unreal posed with the door open and closed. It's a true representation of how the model looks in Unreal in real-time. Only the toon shader was added to the post-process material slot and the lighting from taking the screenshots was reused. No other post-processing, no video effects, just the videos spliced together and encoded at 4K 60fps with the x265 codec.


I really hope this breakdown was helpful and gave you some useful information for approaching your projects. I definitely enjoyed the process of making this prop and it's cool that people have reacted positively to it.

Matthew Messner, 3D Environment/Prop Artist

Interview conducted by Arti Sergeev

Keep reading

You may find this article interesting

Join discussion

Comments 0

    You might also like

    We need your consent

    We use cookies on this website to make your browsing experience better. By using the site you agree to our use of cookies.Learn more