Over 600 VFX shots spanning over 18 months, filmed in our South Australian hometown: we felt that the whole world was watching to see what we could bring to the franchise. We had a lot of incoming assets and complex effects to create that required very high quality work, and Substance enabled us to deliver not only on time but with exceptional quality.
We had a number of hero assets to work on, such as: Scorpion’s melting face and iconic Kunai; a Sub-Zero digital double, and his ice sword; and Jax’s shotgun and frozen arms — just to mention a few.
But our single most complex asset had to be Reptile.
A full CG hero character that starts invisible, has a flare knifed into his back, revealing his true form, then gets shot and stabbed several times, to finally have his heart ripped from his chest by Kano! We knew this was going to be a challenging and exciting sequence from day one.
As the lead artist on the project, it was my responsibility to bring Reptile to life. Let’s take a brief look into his creation and how I exclusively used Substance 3D to create the look for a hero feature film creature.
When we started the work on Reptile’s look development, Substance 3D Painter did not yet have the UV tiles (UDIM) workflow. So a large percentage of the skin texture was created procedurally with instanced layers, smart masks and custom-made procedurals from Substance 3D Designer.
This actually turned out to be hugely beneficial in the end for a few key reasons: as our model department continued to work on the sculpt detail, I was able to start work very early on and update the data maps from the latest high-resolution model almost daily. Features like scales, scars, and exposed skin being geometrically based, I was able to get a very high level of detail quickly and have that detail continually updated during production without having to redo any work when a new model was handed over. This really paid off by giving me the ability to rapidly adapt to model changes; the downside was that the layer stack was fairly sizeable. The base color folder stack alone was over 60 layers!
Below, you can see a small example of the base layer stack. I built it up from flat colors as with traditional painting, and slowly worked in controllable finer details that could be fine-tuned easily later on. A lot of smart masking and custom procedural masks made in Designer helped keep details hugging the scales and medium to large frequency detail.
Color space and viewport feedback
The viewport feedback is already excellent in Painter, but I took it a step further to ensure what I was seeing in the viewport was as close as possible to the final rendered asset in shots.
Rising Sun Pictures is using custom-made acesCG LUTs to manage the ACES color gamut until OCIO v2 is implemented in Painter. However, because all our channels are linear, this is not a big issue and the viewport color accuracy is still very good.
The lighting department was able to bake down their shot light rigs from Arnold into spherical HDRI environment maps that I could then use inside Painter’s viewport. Adding to this, I made a custom GLSL shader that added some debug modes, similar to Arnold’s AOVs when rendering to help judge shading components like specular and sss_albedo response.
This was super-helpful in tuning the skin’s response to the shot lighting, and greatly reduced the round trip between shader releases to offline rendering whilst adding a very strong level of shader stability in shots. “Shader stability” is a term used to describe the final look of the shader itself. We need to make sure that it doesn’t change drastically between lighting setups, which can happen when refining a look in bespoke environments. With this sequence, we had a very dimly lit blue environment turn into a bright orange fire lit environment so it was important to nail the specular response across both of these lighting conditions.
Below, you can see an example of the custom viewport shader and only the specular shading component visible.
Shifting to UV Tiles workflow
About midway through production, we updated Substance 3D Painter to the long-awaited UV tile workflow.
By this stage, Reptile was about 85% complete so the base color was maintained in a file with the instanced workflow. Those maps were then exported and re-imported into a new file for full UDIM support. Layers such as dirt / blood / grime which covered the nails, spikes, and entire body, as well as damage such as bullet and knife wounds, and his brutal fatality, were all created using the updated version of Painter. Even with the instance layer workflow and then finishing with full UDIM support, I had no need to navigate between different 3D paint packages at any stage during Reptile’s production cycle. It was a 100% Substance workflow from end to end.
By the end of production, I had the core base asset maps loaded into a single file with no issues, fully viewable in real time which was mind-blowing!! This was one of several files as we had multiple texture sets for the different progression stages during this sequence.
— Core Base Asset
— Creature FX Stretch and Tension maps
— Bullet Holes
— Knife Wounds
— Flare Burns
— Fatality stages 1 & 2
Each texture set was approximately 19Gb in size and all maps were output at a 4K resolution. All channels were 16bit linear/float EXRs, including ID channels for final rendering. Below is an example of Reptile’s base texture set loaded into a single Painter file.
As mentioned earlier, for baking data maps, I used a high-resolution decimated mesh baked down onto our base creature rig geometry mesh.
This process was simple and fast thanks to GPU ray tracing acceleration. It also allowed the model department to continue to iterate on details then hand over new sculpts for me to re-bake. Iterating in this way proved to be a very rapid and successful workflow that we have now somewhat standardized in our pipeline.
The updated version of Painter brought along with it the latest data map bakers and due to the way I had built up the skin procedurally using smart masks and procedurals that rely on Curvature, AO, Thickness, and more, I got a whole lot of new detail for free simply by re-baking! It worked out really well.
Creating procedural details with Substance 3D Designer
For the bullet and knife wounds, I used Substance 3D Designer to make a custom procedural material with height and ID layers to later use in Painter. The idea was to have a singular point of control for the effect.
Once the wound layer stacks were built up, I used anchors to have this singular point of control and simply duplicated and moved the effect anywhere on the body using the surface tool. This was especially useful as the wound hits changed positions a number of times during shot development. Because of this type of setup, I was able to make these changes very rapidly with a simple click and drag! It’s a really exciting workflow to have.
For Reptile’s eyes, I reused some custom in-house procedural materials that had been made in Designer for previous projects.
Being able to quickly retrofit existing tools and get very high quality results is where I see a huge benefit to the Substance workflow. Since we had already used Substance in production for a number of years, we can benefit from a growing and extensive library of artist-made procedural materials. Re-usability is a big deal when it comes to a production environment and Substance really shines here. I think the longer you use Substance, the more you get — because artists are always creating new assets and these can be stored and reused over time.
Tension mapping Reptile’s skin
A key element to making Reptile’s skin feel natural was using a technique called tension mapping. Tension data contains stretch and compression information; this is generated from the animation rig and is written onto the mesh as geometric attribute data. These attributes are then read in the shader and used to blend in the different texture map sets and shading graph chunks to create the look of skin squeezing together and being pulled apart.
I ended up creating two unique texture sets for this look of stretched and compressed skin. To do this, I first needed control over the scales. Using a combination of the baked data maps and a custom procedural tool I made in Designer that would read the mesh, this gave me a cavity style ID that I could then use to expand and shrink the scales themselves. This allowed me to control the rough size of the scales for this effect, as well as add the soft fleshy look in between the scales, whilst also outputting displacement modifier maps.
The effect as a whole results in the soft flesh being exposed when Reptile stretches out and darker more saturated scales when compressed along with some additional shader work to mimic blood flow. It’s a subtle effect, but it made a huge visual difference to realism when we compared animation with and without tension mapping. It brings realistic fluidity over just a static texture set.
And here is the final asset render for Reptile used in the film.
Substance was used extensively on Mortal Kombat throughout all assets and is a core toolset for us at Rising Sun Pictures. Its our go-to software for texture painting and real-time look development. I hope we will continue to see the software develop and grow in the VFX community; it’s clearly a contender to the current offerings and at the moment stands own its own being the clear innovator in look development workflows.
Rising Sun Pictures and myself are very proud of the results on Mortal Kombat and I’d like to take a moment to thank my lookdev team who produced nothing short of world class work: Robin Reyer, Christina Ryan, Ben Paschke, Abby Nath, Enrico Zerbo, Ang Liu, and Hang Li.
VFX Supervisor: Dennis Jones
CG Supervisor: Bhakar James
Model: Anto Bond
Rig: Tim Mackintosh
Animation: Brodie McCrossin