Jody Sargent explains what inspired the amazingly realistic Carpenter's Workshop scene full of little eye-catching details, talks about creating every object in the shot and telling its story through careful modeling and texturing, and shares some useful tips on optimizing the scene inside Unreal Engine.
In case you missed it
You may find these articles interesting
My name is Jody Sargent and I am a freelance Senior Environment Artist. After working at studios such as Rocksteady and Splash Damage I decided to go freelance and have since worked with a variety of companies over the past 4 years. These have ranged from making VR arenas for immortal babies with Kite and Lightening to short films and many other games projects across different platforms. I still try to fit in the time for at least one large personal project each year and have started to sell these on the Unreal Marketplace!
Creating the Carpenter's Workshop
My initial inspiration for the Carpenter's Workshop was actually getting my garage converted! Seeing it all getting reworked I took some photos of all of the exposed brick and liked the wood beams along the roof that had interesting things hanging there and the mix of really curious old and new objects all in one space. I started looking at loads of references of old garages and workshops that were packed full of cool stuff, some were practical, some were to do with working, hobbies, and crafting, plus lots of personal items. The Carpenter's Workshop just sprang from that and wanting to craft a really detailed space with tons of interesting storytelling and textures. Below are some of the references I gathered for the project. I paid particular attention to the way these environments were lit and also the sheer number of textures. Just the wood alone had so many ages and grains with so much detail so I knew it would be fun to make.
Most of the objects in the scene were modeled in 3ds Max and Substance Painter was used for texturing. One exception was the panel carving which was fully modeled and sculpted in ZBrush. The first step was to make a greyscale alpha to create the relief pattern in the wood. I sourced multiple textures online that were compiled together to make this image that was used as a ZBrush alpha and stamped onto a box scaled to the panel size in ZBrush (1).
I created the uncarved frame piece from other cube primitives to finish the basic shape. I then masked and duplicated a section of the carving that was going to be the part that was unfinished (2). This section was scaled and flattened out using the Flatten brush, leaving just the guideline edges of the carvings. I wanted the effect of the rough shape guidelines having being chipped in before the rest of the carving process (3). A pass was then done using the Clay Tubes brush to make all of the recesses look like rough chisel marks. The Chisel brush was used to add some simple detail to the frame (4). I finished the sculpt by working into the wood further adding imperfections on the intricate sections with the Clay Tubes and Trim Dynamic brushes. Once the sculpting was complete the model was decimated and then cleaned up and UV’d in 3ds Max before being textured in Substance Painter (5/6).
Working on the Details
I used a mix of several methods for texturing in this scene. The breeze block was created in Substance Designer and the brick was a tileable ZBrush sculpt with texturing done in Substance Painter. Many of the props in the scene, however, were textured using just Substance Painter as it's my favourite method of texturing. I think a good example is the woodworking table. For this, I began by creating the basic wood. I like to source good base textures for wood from sites such as textures.com.
Once I have chosen a good diffuse base I will edit and remove seams and any details that are too repetitive (1). I then create a greyscale from this and edit this to make a Normal and Roughness map. At this stage, I am just trying to get a rough feel for the type, colour, wood grain, and age of the wood and also make sure the details are interesting but don’t tile badly.
The next stage (2) is probably the most important and this is adding a lot of the details that age the wood and help to begin to tell the story or this prop. I build up a fine dirt layer in the wood grain from years of use and start to add some random dirt and scuff marks. I also like to add a sun bleach lightening and slight desaturation to any areas that may be in the sun a lot such as the top of the table by the window. Next, I add gouges and chips along the edges and areas likely to be knocked and continue to build upon the surface detail by adding more grime and dust layers (3).
The final stage contains even more storytelling like small rings from paint or varnish cans and bottles that have been placed on the table surface and more paint daubs and flecks where spillages have occurred and dried over time. All of this is to give the prop history and really add to the believability of the scene.
Some more examples of storytelling through texturing are below. Using decals on the ground helped to build up all of the imperfections on the old concrete floor. I also added some scatter props such as dead leaves that had drifted in through the door and windows and the wood shavings to make the ground more interesting. It was also important to me that the different props had different ages as workshops and garages tend to contain a good mix of older and newer items. Having old half-used paint cans next to some newer tubes and bottles, for example, gives the scene more depth in terms of realistic storytelling.
In a similar way, some of the tools like the scissors and rulers look newer whereas some of the saws and chisels look much older with old wood and rusty metal. I made sure that the glass was covered with old rain marks and layers of grime and even paid attention to where dust would have gathered with the top and backs of the shelves being thicker with dust compared to the parts which saw more use.
Assembling the Scene
I like to get a rough blockout of my scene early and create very rough proxy models early on and place them in the scene so that I can play around with the layout in 3D. As this workshop was created to be an asset pack for the Unreal Marketplace it was very important that I could get multiple angled shots at the end to showcase all of the props so I needed a composition that worked in different ways, unlike some other projects I have done where it was about that one main beauty shot composition.
I also wanted something fairly natural and realistic so I did approach this more from a kind of floorplan perspective after looking at real carpentry workshops. I took a few liberties (let's just say it probably wouldn’t be the safest workshop) but that was my main inspiration to make the scene look as natural as I could. I also made sure to arrange the desks so that there would always be a mini-scene to look at from each angle and added some nice parallax with the ceiling and wooden beam with the hanging apron.
The wood shavings are actually one of my favorite parts of the scene and they help to tell a story and add realism and visual interest. I created these simple meshes by making a spiral primitive in 3ds Max (1) and extracting a single strip of polygons from this using the “Create shape from selection” edit poly modifier (2). I set the spline to rectangular and resized it, deleting the polys I didn’t need to leave me with a single strip (3). I then scaled and modified several versions (4) and textured these to create some simple wood curls (5). I used a physics simulation in 3ds Max to scatter these in a natural way using basic primitives as a collision to create different shapes such as corners and strips where they could rest along windowsills or desk edges (6/7).
Lighting and Rendering
The first consideration in my lighting is to create all of my textures within proper PBR ranges and make sure that my albedo textures are mid-range with no areas that are too close to white or black which you can see in the unlit screenshot. This ensures that the light can work correctly and that the texture values won’t be breaking it in any way. I also leave any color grading until very close to the end of the project.
I used raytracing for this environment and the lighting setup was fairly simple. I used a dynamic Directional light and Skylight to do most of the work in the scene with the Directional light casting shadows through the windows as the sun/moon. A small number of rectangular lights were used to boost the lighting coming through the windows and on the strip lights in the night scene. I also used a very subtle Exponential Height Fog with Volumetric fog switched on and used this in combination with some of the lights in the scene such as the strip lights in the night scene to create some natural-looking light shafts.
The post-process was mainly about the color grading and raytrace settings but I did also reduce the vignette and boost the AO a little whilst tightening the AO radius. I played about with the temperature and tint of the scene to give it a bit more warmth and the Film settings to boost the highlights and shadows slightly. Using Ray-Traced GI with Ray-Traced reflections really helped the scene to look more real and natural!
The polycount in the final scene was about 2 million. I was aiming for quite a high-end, detailed interior so I didn’t limit myself too much but at the same time, all of the polycounts were kept sensible and still optimized for games. I use the optimization view modes to keep a check on the scene throughout development. The quad overdraw (1) and LOD (2) view modes are very useful in making sure the scene is not wasteful. Each object has Unreal-generated LODs and cheap simple collision which in some cases was handmade but, in most cases, also Unreal-generated. I also use the Shader Complexity view mode (3) in order to check how expensive my materials are in the scene and you can see that they are all very cheap aside from the objects with translucency which are a little more expensive. I created one very simple master material for 95% of the assets (4) which allows for easy changes and ensures that my materials are all consistent.
Another optimization is in packing my textures using RGB channels to reduce the number of textures I use. I normally use Red – Metallic, Green – Roughness, and Blue as opacity if it is used.
This project took around three months in my spare time alongside work. I think the key to getting it finished is good research and planning. I always start with some good reference sheets and then I create a spreadsheet detailing each mesh that needs to be made and the stages they need to go through for completion. I make sure to add time for lighting, effects, presentation, and anything else that is needed, for example, setting my scene up to be used on Unreal Marketplace as it all adds time on. Setting a project up this way really helps me with time management but also gives me clear goals which really helps me in seeing a project through to the end. Even if I only have an hour free in a day, I can normally pick a small task and get it finished which helps keep the motivation going! Another really important thing for me is having big breaks between projects to avoid burnout and enjoy everything else!