Alex Bouhabén did a breakdown of his latest game-ready asset Medical Pocket Watch: modeling and retopology, metal and glass texturing in Substance Painter, rendering in Marmoset Toolbag, and more.
In case you missed it
You might find these articles interesting
Hi everyone, my name is Alex Bouhabén and I’m a 3D prop/environment artist from Madrid. I started doing 3D in 2013 at ESNE (Madrid), where I studied a ‘Video game Design and Development’ degree for 4 years. At that time I was more into 2D and concept art, so 3D was like a secondary thing for me. It has been since 2-3 years ago when I rediscovered it and started to work harder and learn more about it (programs, workflows, etc). After finally finding out my career path I’ve been enjoying making props for characters and environments a lot, particularly for games. During this time I’ve worked with some small companies and clients doing freelance work and now I’m currently working at Dekogon creating some cool assets.
Medical Pocket Watch: Pre-Production
I started this project with the idea of creating a small but solid game-ready asset, focusing on making it believable through realistic textures and materials.
For references, I like websites like Pinterest or eBay. For this project in particular I used eBay along with Youtube because I also like to watch people manipulate the object I’m modeling to better understand how they work in real life and their dimensions. After spending hours browsing through tens of designs and models I collected a few final references, imported them into PureRef, and labeled/organized them. I decided to make a mixture of different watch models so the end result could be a bit more unique.
The process I follow when creating non-organic stuff is generally always the same. I start with a simple block out, making sure the dimensions of the object are correct, then move on to high poly by adding geometry and support edges where required, organizing polygon flows, and creating an even and subdivisible mesh. Once I’m happy with my high poly I export it and start working on the low poly simply by deleting edges, reorganizing polygons, and optimizing the geometry as much as possible.
In this case, I started with a sphere that I divided into 3 pieces: glass, body, and back. I flattened the glass and the back part a bit just by relocating their pivot point and scaling them down horizontally. After that, I divided the body into 4 pieces; the first one for the dial and front part, and the rest for the different rings that form the watch.
For this project, I decided to go with a low-midpoly approach so I could retain some level of detail in the final model instead of just using a normal map. That’s why I beveled the edges between the rings so I could get that rounded shape.
For smaller parts, I started with some basic shapes (spheres, boxes, cylinders, and rings) and combined them to achieve more complex shapes. The chain links were created by extruding vertically the middle part of a ring and rotating the bottom half. After that, I just reorganized and smoothed out the geometry. For the hands and small parts on the dial, I used some extruded boxes and basic cylinders.
Once I was happy with the overall shape I started to add edges where required to help maintain the shape when subdivided. In this case, I didn’t want edges to be too hard so adding just one support edge instead of two worked nicely.
After finishing adding geometry, I subdivided the model two levels in Maya, made sure the pivots were correctly set, object centered, and transformations frozen. Once the high poly was exported I started working on the low poly. At this point, most of the work had been done already so I just needed to start removing support edges and optimizing geometry, especially on flat and straight areas.
Retopology & UVs
As I mentioned before, the retopology in this project simply consisted of removing edges and reorganizing the geometry, trying to optimize it as much as possible without altering the main shapes.
For the UVs I used Headus UV Layout and Maya. I find Headus a really straightforward program for creating seams and unwrapping. I tried to hide the seams as much as possible and make sure to create cuts on hard edges as well. Once everything was unwrapped I exported my obj back to Maya since I like it more for packing and creating the final layout due to its numerous options. There were some curved islands that could become a problem later on so I straightened them with the Maya’s Straighten UV function and adjusted some others by hand, trying to avoid distortion as much as possible. This is a very important step, especially if you are using a directional pattern when texturing (e.g. wood). Also, it is a good practice at this point to have in mind the direction of each UV island and group the ones that are similar together to maintain some coherence and organization.
For this project, I wanted to have the same texel density on every part of the model and make as few cuts as possible, so I decided to sacrifice some UV space and get an even resolution over the whole asset. That being said, this may not be a good example of UVs optimization, it just worked fine for me.
Once I got the UVs done I imported my high poly and low poly into Marmoset inside a baker previously created. For the baking process, I created different baking groups with the idea of having some separation between pieces to avoid artifacts and issues when projecting. The maps I usually use on game assets are normal map, object-space normal map, position, curvature, thickness, id, and ambient occlusion. I set the tangent space to Mikk/xNormal, samples at 16x (this could be increased), 16 bits, moderate padding, and .psd format. After setting up these parameters and resolution we’re ready to go. The good thing about baking in Marmoset is that you can paint the skew and correct possible issues in real-time and also visualize the offset while playing with the different parameters.
After baking I imported my low poly into Substance Painter along with the maps and started with the project configuration. I set up the shader to pbr metal-rough for the body and pbr metal-rough with alpha-blending for the glass. I also added the mesh maps (normal map, object-space normal map, position, curvature, thickness, id, and ambient occlusion) and an opacity channel to the glass.
I started with a fill layer establishing the basic values: base color, metallic (set to 1), and roughness (set to 0.17). On top of that, I added 2 fill layers (with a black mask each); one to create some dirt and the other one to create some highlights on the edges. I adjusted the base color, metallic (1 for the highlights, 0 for the dirt), and roughness (same as the base metal for the highlights and close to 1 for the dirt). I added a metal edge wear generator inside the dirt layer’s mask and a mask editor generator inside the highlights’ mask. Inside the mask editor, I used the ‘grunge_rust_fine’ as texture. On top of this, I added 2 more fill layers to keep generating imperfections. Both layers have base color (dark brown), roughness (around 0.6), and metallic (0) information. I created a black mask on each layer and added a fill adjustment layer. Inside these fill layers, I added different grayscale grunge maps (that come with Painter) and played a bit with the parameters until achieving the desired look.
For scratches, I created a fill layer with a black mask where I put a fill adjustment layer with a grayscale texture called ‘grunge scratches rough’. To control these scratches a bit more, I added a paintable adjustment layer on top of the fill adjustment layer (these two adjustment layers are inside the black mask) and painted with black the zones where I didn’t want scratches. Lastly, I created another fill layer with roughness information (set to 0.65) and a black mask to give the back part of the watch a more worn out look.
I used the same material structure for the hands and the rest of the inner parts. I simply deleted all the highlights on the edges and played with the dirt values. I also darkened the color so I wanted these parts to look a bit more aged.
All this may seem a bit complicated but the idea is pretty simple – just to create a base metal material and keep adding imperfections through dirt, highlights, grunges, scratches, and so on, always playing with color, metalness, height, and roughness (the most important one). All these details should be pretty subtle, if we overdo them we’ll move away from a realistic result.
Metal overall process:
The impact of roughness on the end result:
For the glass, I started with a fill layer with the following values: roughness (set to 0), opacity (set to 0.3). On top of that, I added another fill layer with dark brown as base color, roughness set to 1, and opacity set to 0.23. I created a black mask and painted some random parts of the glass with white to add variation. I used the ‘Dirt 1’ brush with flow pressure enabled and low value (around 10). Lastly, I created another fill layer with dark brown as base color, roughness set to 1, and opacity set to 1 to add more variation. I painted with white on the black mask, this time just around the border of the glass simulating accumulated dirt.
It’s important to pay special attention and spend time working on the roughness map, especially when we’re texturing glass. Painting it by hand will allow us to achieve a more organic result instead of just using a smart mask or procedural texture. For this watch, I didn’t want a glass that was too old or too damaged, so I added a bit of dirt on the border and left the center almost intact. I wanted to convey that the watch was quite used and old but well maintained.
- Height details
I made all the small height details directly in Substance Painter by simply creating an empty fill layer with the height parameter set to -0.29, making a black mask, and selecting a pill-shaped alpha for the brush. I set the brush alignment to UV mode, set the color to white, and oriented the alpha vertically. After that, I adjusted the spacing and set all jitters to 0. Also, pen pressure should be disabled at this point. By following these steps we can create the height detail around the middle ring of the watch with just one stroke.
I recommend to always blur a bit all the height information created in Substance because it tends to be too harsh.
For the dial, I used a real photo and projected it onto the UVs using Painter’s projection tool. After that, I added a levels adjustment layer for darkening it a bit to match the overall luminosity and make it look a bit older. For this task, I’d recommend using a hard brush with disabled pen pressure, alignment set to UV, and just color information. Then, I added a paintable layer to slightly modify some colors and make the whole dial more cohesive. Finally, I created a fill layer with just roughness information (set to a high value close to 1).
Preparing the Renders
Once I finished texturing I exported the textures at 4k in png format. I normally use the pbr metallic roughness template and dilation infinite. After exporting all textures I imported them along with the low poly into Marmoset. Once in Marmoset, I set up 2 materials: glass and watch. I used the following configuration:
Then I started setting up the environment. I always browse through all the HDRIs trying to find the one I like the most and for this project, I liked the one called ‘abandoned’. Once I have the HDRI set I start creating and playing around with lights by clicking and dragging them across the HDRI thumbnail. I opted for a clear and neutral illumination so I adjusted the parameters of the lights accordingly.
After setting up the HDRI, I started adjusting the render parameters. I always enable local reflections and global illumination and set all to high quality (this may vary depending on your computer specs).
Lastly, I set up the main camera. You can play with cool parameters here but I recommend not overdoing things. I find it a better option to make some of these adjustments later on in Photoshop. In this case, I just adjusted exposure, contrast, and sharpen strength.
Another useful parameter is ‘safe frame’. By enabling this you’ll be able to preview your render dimensions and see exactly what you are exporting.
Once I had all my images exported, I used Photoshop to adjust contrast and brightness again. I always export my renders in png format with transparency enabled so at this point I can play with different background colors and experiment with some variations. If you doubt about which color to choose, I'd suggest exporting one version with a plain black background (works most of the time) and then keep experimenting with other variations. I think it’s worth spending some time here since at the end of the day people will be watching an image, so it doesn’t matter all the previous work if the final output looks poor.
To this day I still have so much to learn, but if I had to share some tips here are a few:
- Start small: I’d rather have one small AAA prop than one complex environment with 20+ mediocre props. Don’t be too ambitious too soon.
- Study the basics: Modeling, topology, UVs, baking, color theory, composition, lighting, rendering… It’s nearly impossible to know every little aspect of everything but it’s important to know the basic ‘do’s’ and ‘don’ts’ of every step of the process.
- Don’t overlook ‘small’ errors: This could lead to a snowball of further problems. Fix the issues at the moment instead of letting them accumulate no matter how small they are. You’ll also save time later on.
- Always keep working on something: I think it’s essential to keep practicing and facing new challenges to become a better artist. Compare your current work with your previous one and try to raise the quality bar with the next one.
- Have referents: Learn from others, study the works you like, and try to figure out how they achieved that result, or simply ask the artists.
- Be open to feedback: Share your work online and be prepared for criticism or ask your artist friends for it, but the less biased the feedback is the better. We all want to get better and sometimes some harsh truths are needed.
- Be part of a group: Artstation, Facebook, your art school, group of friends, game studio… Being part of something bigger boosts motivation and may create some healthy competitiveness.