Daniel Elsworth shared with us the workflow behind the 3D Sony Tape Recorder model, inspired by the Mindhunter show, discussing the texturing and rendering pipelines in Substance 3D Painter and Marmoset Toolbag.
My name is Daniel Elsworth, I'm a 3D Artist who is currently living in the city of Leeds in the United Kingdom. I've been working on my 3D skills for around 5 years now which includes my time at Sheffield Hallam University where I graduated from the Games Art course. Since then, I have been working on my professional portfolio and slowly building my skills as a 3D Artist.
Here I will be talking about the texturing process of my most recent piece of work, the Sony TC-510-2 prop, as well as demonstrating the process of texturing my models with some information on how I approached baking and rendering.
The Planning Stage
Usually, I spend a lot of time planning my projects. It is crucial to gather as many reference images and product guides as possible before starting production. I prefer utilizing a combination of high-resolution close-ups of real objects and existing models on platforms like ArtStation.
For this particular project, my objective was to create something that closely resembled real life. I aimed to optimize the prop while utilizing multiple UDIMs to ensure ample resolution for texturing. The inspiration for the tape recorder prop came after watching the Mindhunter show on Netflix. Being a fan of David Fincher's films, when I saw the show and came across Adam Savage's breakdown of the prop, I was immediately captivated. This motivated me to start blocking out the prop in 3ds Max.
Baking With Marmoset Toolbag
Usually, I get to Marmoset Toolbag as early as possible with a prop I am working on. It helps me visualize the final result and identify areas that require further attention. Personally, I find it motivating to see the model rendered with ray-tracing, as it boosts my confidence and helps me overcome self-doubt, which is a common challenge for many artists.
Depending on the complexity of the model, it is always good to separate parts when exporting from the modeling software. This helps prevent issues with baking such as unwanted AO bakes, overlapping Normals, and so on. I find Marmoset Toolbag well-organized and user-friendly, making it easy to achieve visually appealing results.
Setting Up For Texturing
Before beginning my work, I make sure that my scene is set up according to my personal preferences. After following an exceptional tutorial by Jason Ord, I adopted the Sensitometric Tone Mapping technique and started to use the SRGBF color profile to accurately replicate Unreal Engine's lighting profile. Typically, I split my objects into different views since Substance 3D Painter does not allow manipulation of light XYZ rotation. However, for this particular object, I found it unnecessary and proceeded without it. Additionally, I preferred using the UV tile texture set setting, and for this project, I utilized five texture sets.
Furthermore, prior to delving into the texturing process, I established a LookDev scene in Marmoset Toolbag. This involved setting up a suitable camera angle, a three-point lighting system, and incorporating the soft ring High Contrast Studio HDRI that I exported from Substance 3D Painter. This approach facilitated seamless back-and-forth adjustments, enabling me to assess how the materials held up in the final renderer in real-time.
After importing my model and Maps, I re-baked the Ambient Occlusion, ID, Thickness, and World Space Normal Maps in Substance 3D Painter. My opinion is that Substance 3D Painter did a good job of baking these Maps. The first thing I did in my scene was making a curvature overlay layer by plugging in my baked Curvature Map to the Base Color and setting it to "overlay", reducing the opacity. This emphasized the baked information and highlighted it in the base color, making it more pronounced. You can edit this setting at any time. I copied this layer and repeated it for each texture set.
The asset I was working on required a lot of alphas. I preferred to make them in Photoshop, as without them it would be much harder to gauge the final image. I packed most alphas into a large 4K image, as I would be applying them by using Stencil.
I set up the text by creating a fill layer, entering my desired properties, adding a black mask with a paint layer, and using Stencil to paint the alphas onto the mesh. Then, I applied an Anchor to that layer. This was a very useful tool that restricted all the mask values below it, allowing its use in other layers. As an example, when I wanted to introduce a color change and height to parts of the text, I applied the Anchor to the black mask, created a new fill layer with properties that closely matched the reference, and then added a black mask and another fill layer. Next, I selected the Anchor, which was in its own tab, and added a paint layer above it to manually remove the unnecessary text.
To add height, I repeated the process by adding a fill layer with a Grunge Map and setting it to "Multiply" to combine the fill with the text mask. Then, I set the properties to only add Height and Roughness. For the Roughness layer, I changed it to "Overlay" to maintain the Roughness values when working on the materials below the text.
Making a Smart Material
I prefer to add to my personal collection of smart materials in every project. For this one, I created a brushed aluminum metal. I found that some of the hardest materials to recreate in Substance 3D Painter were metals as they refracted light in many interesting ways and could change depending on their exposure to the elements and how the components were manufactured.
When I created the new smart materials, I started with a base layer. In this layer, I determined the main color, Roughness, and metallic values while disabling Height and Normals. For metals, I incorporated Grunge Maps to add variation to the color. I thought that adding blues and purples gave a more realistic tone to the metal. Depending on the reference, metal shavings, and imperfections helped break up the material. I wanted to make these elements rough and add a slight amount of Height.
For the grind effect, I used a scanned Grunge Map sourced from Megascans. I highly recommend building a library of scanned textures from reliable sources like Megascans and Textures.com, as they provide the most authentic Grunge Maps. Finally, I added a significant amount of breakup to the Roughness Map by incorporating two layers, both set to overlay. The first layer consisted of a Base Roughness with a fractal sum Base Map, subtly introducing Noise to the Roughness. The second layer uses a Grunge Map to generate larger breakup areas and lower the Roughness values close to zero. This creates a noticeable contrast in Roughness throughout the texture.
Valuable Changes to Normal Maps
Every product has imperfections during production with varying subtlety and depending on the use case of the product, it may have a lot of wear and tear. It is important to add these details to your asset as they can give life to a prop, rather than every detail being immaculate. However, it is important to not overdo it, as this will make the prop appear noisy and some details can draw attention away from the overall image. Cross-examining plenty of references and picking out certain imperfections is how I like to approach these details.
A good practice before I show the explanation of my techniques is to use anchors at the end of every layer with height changes. This will allow you to make any base property changes to the normal details and control how other layers react to them, as long as the layers are above the original anchor layer.
I noticed that in quite a few of my references, the edges of the front panel were slightly warped. To create this effect, I made a fill layer where I removed everything but Height, giving it a slightly negative value, and then used the baked Curvature Map as a mask. I changed the levels to clamp the corners and remove the rest of the map I didn't need. Then, I used a blur to soften the edges and a warp filter to achieve the effect I wanted. Finally, I used a fill layer with a Grunge Dirt Map and set it to multiply to add a lot of variation to the mask.
For the Directional grind, I once again made a fill layer with the properties I was after, for this detail I wanted it to affect the color, Roughness, and Height. I started the mask with a scanned Directional Noise, I found that this was too strong, so I added Anisotropic Noise using "multiply" to combine the mask with the scan. Then, I added a Cloud 3 to add random Height imperfections and a paint layer to remove the areas of the mesh I didn't want to affect.
Sometimes the baked details might not be as prominent as desired, requiring the exaggeration of details during the post-production phase to highlight them. An example of this in my prop is the knurling pattern on the top dials and front switches. After adding the metal texture, the knurling was difficult to see in my LookDev scene. To enhance the effect, I decided to increase the Height of these areas. I used the Curvature Map to identify the regions, applied levels to clamp them and then increased the Height value. By fine-tuning and comparing with the LookDev file, I successfully achieved a more pronounced effect.
Making an Interesting Roughness Map
Roughness Maps are incredibly important for achieving realistic results when texturing a prop. I added a lot of subtle differences across each material to incorporate a storytelling element into the prop, showing how the prop might be used. For every layer, I used "Overlay" in the Roughness for any additional details so that every layer below is equally represented and I can control the overall values using the base layer.
I like to use the Baked Maps as an initial mask layer as much as I can, as evident from the previous examples. I used the curvature layer more than most as this allowed me to control any baked normal detail and make changes depending on the Height of the material. For the switches and dials, I used the Curvature Map and levels to clamp the edges of the knurling pattern, I then inverted this to only select the areas with depth. I used a Fractal Sum 2 to add some Roughness breakup and kept the layer on normal. As the mask didn't have any information on the edges of the curvature, the layers below would control its Roughness, which is derived from the smart material I made above with the Directional Noise layer disabled.
To enhance the uniqueness of a generic plastic material, I dedicated considerable time to breaking it up. For the side panel, I started with a base layer and added a White Noise layer on top, applying a blur filter to introduce immediate roughness and height detail. To further break up the uniformity of the material, I utilized a combination of Dirt and Cloud Maps. In order to incorporate tiny shaving-like imperfections from the reference, I employed a Fractal Sum and a Dirt mask, reducing the roughness and adding a slight amount of Height.
In order to depict more noticeable imperfections on the surface, I aimed to include larger Height information. I obtained a scanned scratch mask from the Megascans library and adjusted it by setting a low Roughness value and a slightly negative Height value. Additionally, I introduced larger shaving details using a Grunge Shaving element, incorporating a Dirt mask to break it up. Next, I modified the color to an off-white hue, increased the Height value, and assigned a low Roughness value.
Lastly, I focused on breaking up the ventilation holes. I followed a similar process as I did with the front panel, utilizing a Curvature Map as a guide and adding a grunge map to introduce more interesting details. This step was conducted to ensure the holes appeared non-uniform.
Dust and Grime Using Smart Masks
Once I finalize my base materials, I wanted to go in with some more uniform dirt and grime using Substance 3D Painter's smart masks. The main one I used in this project is "Cavity Grime" as it creates a mask depending on the height and direction of the mesh. This lets me build up dirt in the smaller divots and add more overall interest to the image.
I started by adding a hair and dust mask that I bought, using levels and a B&W mask to lower its effectiveness. For all of these layers, I was affecting every Map and using the same values for every texture set. Every item that you use will have some level of hair and dust on it unless you choose to add a cleaning effect with fingerprints and wipe details.
Then, I made a group and added my first "Cavity Grime" pass. Some of the elements felt a little too aggressive for the center of my prop as they were covered by another element. I used a paint mask to remove them, then copied the smart mask to another layer and changed the "mg_Dirt" properties to better suit these areas.
The final layer I used was to show how the item might be cleaned. For this prop, I used a Wipe Grunge which I added on top of the cavity grime dirt mask to control what areas it would affect. I only used this layer for the texture set that controls the top of the model as this gave the metals some great details and added to the storytelling of the prop.
Rendering in Marmoset Toolbag
The rendering setup I used was quite simple, but I believe it produces great results. I employed the traditional three-point lighting setup, with a large-scale, chamfered 90-degree plane as a background to catch the light and create shadows. I always experiment with HDRI environments. In this case, I used a combination of Studio Tomaco from Substance 3D Painter, along with 2PointHighContrast and Studio Single Point light.
Next, I set up my cameras. I prefer to use a low FOV as it gives the prop a more flattened and true-to-life appearance. Increasing the FOV creates more depth, making elements further from the camera appear smaller. I applied the ACES tone Mapping, as it automatically produced a more contrasty image, which I personally find visually appealing. I also tend to frame my images in the 4:3 aspect ratio, as I believe it enhances the appeal of props.
To create the plastic cover, I utilized the Transmission option in the material properties. I set it to Refraction and use the Alpha Map of the Albedo, which I export as the Transparency Map in Substance 3D Painter. Regular transparency with dithering did not yield the interesting reflections that a plastic cover would have, so using the refraction option was the only way to achieve satisfactory results. For the glass elements, such as the front readers and number dials, I employ the traditional transparency with the Dither method.
This project was a great learning resource for me! I believe that thanks to it, I have developed my texturing skills further and will carry it all on to my future projects. Hopefully, my breakdown has given some insight into how I think and tackle certain challenges as I carry on in my journey as a 3D Artist. Thank you for taking the time and reading the article!