Check out this massive, 2-part tutorial by Jonathan Holmes on using Quixel Mixer in hard-surface texturing of a LearJet 24 aircraft.
Intro to Mixer
Mixer is Quixel’s flagship texturing tool. Like NDO and DDO before it, Mixer allows you to create procedural or scan-based textures. Mixer is completely standalone, and is capable of working with custom models, UDIMs, and other aspects of modern workflows - all for free! Even if you don’t have a Photoshop or Quixel Suite background, this tutorial should help you out - maybe you’ll learn something new!
In this writeup, I’ll be documenting the work that went into creating my LearJet 24 and how I leveraged Mixer with Photoshop to get a Quixel Suite-like workflow in Mixer. This was a common business jet from the 1960s to the 1990s and had a unique fighter jet-style profile, which made it stand out among other business jets. I will be going step-by-step over critical aspects of the project and how different parts of the texture job were created.
The tools used for this tutorial are listed below. You’ll need them to follow along:
- Mixer project, Photoshop file, low poly model, and input maps.
- Adobe Photoshop: Not free, but available for a low monthly subscription.
- PureRef: Image canvas software. Please support them with a donation!
- Quixel Mixer: Free-to-use 3D texturing software.
If you’d like to follow along and don’t have Photoshop, there are many alternatives that will work just as well. I’ve listed a few below:
- GIMP - Freeware image editing software.
- Krita - Another freeware software suite.
- And many others are available as well.
Setting Up Your Workspace
Your workspace, as in the screen space you’ll be using, must be optimized for a pleasant working experience. I cannot stress this enough. If you have to fight your screen layout to get work done, you’ll be frustrated and less creative. I suggest that you should set up your workspace so that, ideally, you would minimize any workflow disruptions caused by improperly placed windows, tools in areas that are more difficult or less intuitively accessed, etc.
I work with three monitors, so I’ve arranged my windows so that PureRef takes up the right-most monitor, Mixer takes the center, and Photoshop takes the left. I’ve also set Photoshop’s layers panel to take the right monitor and have PureRef share the screen with it. I work well this way, but your approach might vary. If you have more than one monitor, I highly recommend using all of them for your work.
Photoshop on the left, Mixer in the center, and Photoshop/PureRef on the right:
Let’s go over the different functions of Mixer so you have a brief overview of what to expect in this tutorial and can follow along easily, or can reference what I’m discussing later on. For a deeper dive into some of these technologies and techniques, please read through the Mixer manual.
For those of you new to Mixer, let’s go over the basic Mixer interface for texturing purposes. The orange area is the Mixer tray. Within the tray you’ll find the following options:
- PBR Metalness dropdown: This is where you can switch between different map displays in the viewport to preview roughness, albedo, or other maps in a solo unlit view.
- Select Visible Parts: You can use this dropdown to control the visibility of other texture sets in Mixer, improving performance by focusing on specific sets to work within an isolated view.
- Preview Displacement: This option displays height data on your model in a displaced format. In short, it’s a displacement preview. You won’t need it for this type of project since there won’t be enough polygonal data to displace correctly.
- Preview Tiling: Does just what it says! This previews the texture you’re working on in a tileable format. This also works with 3D assets; results may vary.
- Show Grid: This places a visible grid below your model in the viewport. Grid divisions can be adjusted via Display → Grid → Subdivisions. Available options include Disabled (Off), Decimeter, and Centimeter. Grid color can also be adjusted to suit personal preferences.
- Active Focus Area: This option is for usage with multiple texture sets. It will highlight the currently selected texture set in the Mixer viewport.
- Select Camera View: Switches between UV view and 3D view.
- HDRI Selection: Allows you to choose between the various pre-supplied HDRs that Mixer ships with. There is no option to add custom HDR backgrounds.
The blue area is the Layers panel. Within this, you’ll find your layers, along with layer groups. At the bottom of the tray are layer-related options:
- Add a Mask Stack on This Layer: Creates an editable procedural masking stack for the currently selected layer only.
- Add Material ID on This Layer: Provides another additional mask option for color-based masking using traditional ID maps for the currently selected layer. These are also uncommonly known as “clown” maps.
- Paint a Mask on This Layer: Creates a paint-based mask for the currently selected layer which works in conjunction with the procedural masking system, but will override anything in the procedural mask. Best used for fine detailing or for adding non-procedural details to specific areas.
- Add Group: Places selected layers into a folder for organization or creates an empty folder into which layers can be placed.
- Delete Layer/Mask: Removes the currently selected layer. If a layer mask is active (e.g. selected and highlighted in the layer tray), the mask will be removed first. Performing the delete command again will then remove the selected layer.
Layer Options or Mask Options will be displayed on the right-most Mixer panel, contingent upon whether you’re working in an active mask stack or just working with a selected layer. Within this, you’ll find layer-specific options for adjustment and fine-tuning, along with mask-specific options to create procedural masks and other refined detail.
Within the layer options panel, there’s a variety of tools for you to choose from. Let’s start from top to bottom for simplicity’s sake:
Opacity: Controls the overall opacity of the layer. Values range from 0 to 1, 0 being invisible.
Height Blending: With the new release of Mixer that this tutorial is designed around (2021.1.2), there are some subtle but significant changes to the Blend types in layers.
Blend Above and Blend Below are both removed in favor of straight-forward Height Blending, which is enabled via a checkbox. Height Blending combines the functionality of the old-style Above/Below blend types into a single slider.
You can adjust the Height threshold which will cause the layer to push into or away from the surface it’s currently masked to. If anything looks awry when doing this, you can check the Invert tab if Height Blending is enabled. Most of this project had height blending disabled since hard-surface detailing in Mixer doesn’t really require it – I want details to pop out based on the layer mask, which is the default behavior if Height Blending is disabled.
Wrap to Underlying: This option causes the layer’s height to conform to the underlying normals. A value of 1 causes the layer to fully conform to the underlying normals, while the opposite is true for lower values.
Blur Underlying: This will blur the underlying normal data in the mix, causing the active layer to take precedence visually over the existing data.
The rest of the controls are better covered in the Mixer manual.
Mask Component Types
Let’s go over the various mask options so you can understand what they do and how they’ll function in your project, especially in a 3D context. A hotkey we’re going to use often is Layer Mask (9) – keep this in mind while working! Each mask type can have various blending modes to create certain effects. I’ll go over how I use these blend types and opacity controls later in the tutorial. For now, let’s cover the basics so you’re up to speed with what Mixer currently offers as of writing this tutorial.
Solid: Creates a fill layer with a solid color. Since this is a mask, it will only be grayscale.
Texture Map: Creates a layer within the stack that allows you to load an image. This can be used in a variety of ways, including creating heightmap data from images, which is one way we’ll be using it today. It can also be used to mask off specific areas from the effects of the entire stack or add areas to the stack.
Noise: Creates one of five different noise maps: Simplex, Perlin, Worleys 1, 2, and 3.
Pattern: Creates one of four different patterns: Square, Circle, Checker, Gradient.
Normal: Creates a mask using the normal vectors of the mesh including any additional normal data you’ve added in Mixer.
Curvature: Mixer has a real-time curvature baker which generates curvature data from your mesh and its normals, including any normals you’ve added to the mix. This can bog down performance severely as more Curvature-based masks are created so it’s important to remember which layers use this mask type – you can turn off layer visibility and improve rendering while adjusting other layers.
Position Gradient: Mixer also ships with a built-in Position Gradient baker which is calculated at the time of generating the mesh. This can be used to specify specific directions for certain effects, like engine exhausts, wear and tear, etc.
Mask Modifier Types
Brightness/Contrast: Put simply, it’s a contrast adjustment layer. Whatever you’ve placed below it will be affected.
Clamp: Reduces the range of value that can be utilized on the stack. Without Clamp, it is possible to push values beyond 1.0 into HDR territory to make unique and interesting masks. With Clamp, you can keep values predictable and artist-friendly. Mixer does not auto-clamp masks - you must add Clamp to the stack to keep values within the 0-1 range.
Invert: It’s pretty self-explanatory – Invert flips the current values. 1 becomes 0, and vice-versa.
Normalize: Normalizes the pixel intensity of any values in the mask stack below the Normalize modifier.
Gradient Remap: Remaps the entire range of values below the GR mask component. The range adjusts the 0-1 value range. Moving 0 up progressively darkens values, moving 1 down progressively lightens values. Repeat causes the gradient to repeat itself to the specified target, and Curve adjusts the falloff – or the midpoint – of the entire effect. Mirror is essentially an inversion of the GR component.
Posterize: Converts smooth gradient values to stepped values
Gaussian/Directional Blur: Both are blur components. Gaussian blur provides fine control over blur values, Directional blur provides the illusion of movement – such as for grease on the leading edges of the wings that get swept back over the wings with the airflow.
Bevel: This component provides a gradient, or slope, to hard edges. It can also be used with softer textures to produce interesting results.
Circular Transform: This component provides a circular transformative effect to the mask stack. Anything below it will be affected. It can be useful in vehicle texturing like this tutorial but would be limited to very niche cases on a “test and find out” basis.
Scatter: This component takes the entire stack below the component and duplicates it randomly according to the settings you’ve provided. It’s of limited use in this tutorial unless you’re interested in scattering around various dings and scratches that you’ve loaded, or have created a neat mask that you’d like to subtly replicate across the model.
Projection: This right here is the game-changer in Mixer. Projection allows you to box-project anything below the Projection mask, inside the mask stack, across a model. Once you adjust the settings, models can be seamless – or as seamless as a complex model like a private jet can possibly be. There’s a lot of values in Projection, so I’ll let the Mixer manual cover this one. Learn how to use Projection - it is hands down one of the most useful features in Mixer.
Let’s get into the details now that we’re out of the Mixer basics and overview!
I set up this jet in a layer-based system similar to how real vehicles are constructed:
- Height data
- Base coatings (initial paint coating)
- Metallic definition
- Final paint coatings (stripes, registration numbers, etc)
- Subtle metallic warping
This was a deliberate decision to emulate how vehicles are built in reality and how weathering impacts them, leading to a more realistic end result that matches up with my reference images and adds an air of authenticity to the final product.
The base coatings of paint give the jet its distinctive appearance. There’s a base white layer that is set to a value of 85 RGB to avoid reflecting too much light back (breaking the laws of physics) but to also keep it from looking gray in shadowed areas. Above this white layer is a group called Paint which contains all of the metallic paint swoops that give the jet a sense of motion.
The mask for this was developed in 3ds Max using spline modeling techniques coupled with booleans. The swoop would be incredibly difficult to paint, otherwise, as I would have needed to maintain a smooth curve across three different UV shells. This is not an easy task, and it would necessitate constantly checking pixels and sub-pixel values to ensure that everything would be a smooth transition.
The solution to this was to boolean the shape of the swoop into a copy of the geometry and turn the new geometry into a mask, as seen below:
When these splines are extruded into a shape, they can be used in a boolean operation to cut the intersecting geometry without reshaping it.
This produces a perfect replica of the shape on the model’s geo, which can then be selected in your UV editor.
This selection can be converted into a mask and loaded into Mixer!
The same workflow was used for the gold and gray metallic stripes, saving me quite a few hours of painstaking hand-matched curves across UV shells.
Height Mapping – Photoshop Basics
All of the fine detailing in this project was done by hand in Photoshop. If this idea sounds familiar to you, it should! This is basically the same technique I used for my NDO and DDO tutorials in 2016, but adapted for working with Mixer!
I could have modeled the panel lines and other fine details, but I’m not interested in modeling fine detail given how long it takes or the large chance that fine detail may get lost in sub-pixels when creating a breakdown. There are many variables that go into the decision. Ultimately I choose to hand-make height data for fine detail because I can guarantee that it will come out pixel sharp. Let’s compare a few Photoshop layers to the final result, you’ll see what I mean.
Open up the PSD I’ve supplied for this tutorial and you’ll see a large selection of layers and groups.
I’ve organized, tagged, and named everything so you’ll know what to look for and how to work with it. If you’re not an aviation geek like I am, that’s OK! You can always find the layer names I’m referencing in the document to see how they were constructed.
Let’s start off with how I began working on the project - find the layer group named Nose, tagged in green, and enable visibility on the layers titled Nose Panel and Bolts. If you’ve enabled the UVs and AO layer at the top of the layer stack, you’ll have an understanding of the particular curvature of the nose and why the panel lines were laid out how they were.
Creating UVs for hybrid hard-surface and organic objects, like aircraft, can be a nightmarish ordeal. These were the best UVs I could get for the type of effect I wanted: straight panel lines, or at least as straight as I was going to get with a smooth surface tapering on a curve. I’m pretty certain that this final UV layout is the 25th iteration of the UVs, and even then they could still use improvement. Nothing is perfect, we just keep making mistakes and improving as we go along.
The UVs are straightened vertically to align with the polygons of the model in this area, which reduces or outright eliminates distortion in the UV map. This allows you to have straight pixel-sharp detail with minimal wobbling. I’ve never had any luck getting perfect cylindrical UVs on tapered objects, so my best attempt at this (after five different tries at a layout) was a pair of planar projections stitched together at the top of the fuselage where the cockpit joins, with a bit of relaxing and straightening.
The height theory I’m using to drive this project’s textures is based on the fact that all normal data is simply 3D data which is translated into a 2D image. With appropriate editing, you can transform any 2D image into a Height Map in Mixer, which will protrude or inset into the surface and provide normal mapping without needing to bake that detail from a high poly mesh. You can see what you’re doing in real-time and can edit and adjust as needed.
I always start with vector shapes in PS and add layer effects to produce the desired result. Layer effects were used to drive almost every effect that NDO and DDO were capable of, and they’ll be a huge help here as well to produce softer panels and other details.
To cross-reference in Mixer, open the folder called Height, tagged with red, and scroll down to the Nose folder which is tagged in blue. The layers in PS are named identically in Mixer, making it easy to swap back and forth to see which layer you’ll need to examine as we continue going over how this jet was built.
Selecting the Nose Panel layer will open the aforementioned layer panel, so you can see how I’ve set it up. I’m working with opacity blending (e.g. Height Blending is disabled) with height set to -2.5. This value was chosen because the mask driving this layer is primarily black, with white outlines for the paneling, causing the white-masked areas to inset as normal detail into the fuselage of the jet. Most of these layers will use the same layer setting as most of my layers are primarily black with white accents.
Entering the 2D/UV view and enabling the layer mask view shows that we’re getting an identical result from PS to Mixer, making the transition from 2D to 3D simple and easy to understand.
All of the Nose group was constructed in a similar fashion to the paneling. I cross-referenced photos in PureRef and used Photoshop shapes to start laying down panel lines and other details like the radar “zippers” commonly found on the nose of jet aircraft.
There will be a little bit of pixelation visible due to using one 4k map for the entire aircraft. I minimized this where possible by making UVs that allowed for straight lines, but any curved paths or painted details will show at least a little bit of pixelation. This is normal. If I was working in 8k, or cut this project into two 4k maps (wings, fuselage) it would be somewhat less pronounced.
I won’t go over every single heightmap I created for this project as there’s at least 50 of them in total, if not more, but I will go over the specific ones that I feel are of interest and help demonstrate some Photoshop features that should make it a lot easier to use height maps in Mixer.
One area of interest that immediately jumps to my attention is the layer called Cockpit Trim, visible in the image above. This was laid out by hand in PS as a solid layer:
I used one primary shape to trace the outline of the aluminum window frame and a sub-panel set to subtract from the front-most shape in PS to mask out parts of it where the nose window joiner is. You could also use a layer mask here instead, but I prefer using vector shapes for ease of work. When one side was completed, I copied it over to the other side by ALT+LMB+dragging downward and Free Transforming to fit the other side, as such:
It’s the easiest way to get an identical result from both sides. The next step is to take this into Mixer. When you export a layer like this, export it as primarily black with white masks for the visible details you’re planning to bring out.
When imported into Mixer via the Texture Map mask, height blending of 1 with underlying wrap set to 0.9 produces an effect of inset aluminum paneling – precisely what I’m looking for here.
The leading edges of the LearJet were developed using the same technique.
The access panels on the ventral side of the wings were developed using a copy/paste technique as well, but also used some lesser-known functions of Photoshop’s shape tools. Let’s go over that next!
These panels are for accessing the internal structure of the wing and various hydraulic components that run the control surfaces. They definitely need to be represented here. To create them, a single rectangle shape in Photoshop was made. To access the shapes, you can press U. If the shape isn’t defaulted to a rectangle, you can press and hold the shape tool in the toolbar to open a menu that allows you to select it.
PS shapes have come a long way since they were first introduced. Photoshop now features Live Shapes which allow you to choose the corner fillet of each corner or all corners simultaneously. It’s a super handy tool for creating rounded rectangles or pill-like shapes such as the ones we find underneath the wings.
One downside to Live Shapes is that transforming them in any way is destructive – by this, I mean that the procedural editing you see here is no longer possible and the shape becomes locked in. You can add points and adjust the shape but it won’t be as simple as this technique, so be sure you’ve got your shape set up correctly when using Live Shape editing prior to transforming it.
The oval panels are set up as outlined (Stroke) shapes because I want them to be set into the wing in a panel-like manner. This isn’t possible without defining the area to inset with the mask I developed. Copy and pasting the ovals and rescaling/adjusting the Live Shapes prior to scaling and rotating produced a quick amount of work, especially since the wings are mirrored on both sides.
Control surfaces were up next. These were created with paths as well, using additive and subtractive paths as mentioned earlier in the write-up. There’s also a curveball here - I added depth to the ailerons because, in essence, they are miniature wings connected to the wing structure with a hinge. They are rounded in the front like the wing itself is. As they move up or down in opposition, they cause the jet to roll. One side moves up, the other side moves down. Getting this to look right is crucial to sell the idea of the finished product.
The mask for the ailerons and the flaps are two different layers on top of one another in Mixer. Here’s how they look combined, versus how they look separated.
Note that the spoilers above the flaps are not rounded and don’t require this sort of depth pass. This was accomplished by using Smart Objects in Photoshop and importing the mask data to two different layers using unique layer settings. Here’s the setup in Photoshop:
You can see how this effect was achieved now. Using a mask, I outlined the ailerons and flaps and used that mask to draw a brushed gradient across the leading edge of the surfaces. This black blend was then inverted and duplicated into another Smart Object so it would be easy to export two separate masks.
Smart Objects are essentially a 2D instance of whatever you place inside them. They can be duplicated and placed wherever you like in your PS document. As you adjust what the Smart Object contains, it will instance that data back into your PS canvas wherever the Smart Object is located.
The layer settings for Aileron Depth and Ailerons are visible above. Wrap to Underlying is the magic here. With the mask for the leading edges of the ailerons and flaps blocking out the hinge points, it really looks like it was modeled surface detail which was baked down from a distance. A quick reminder that these details are all picked up by Mixer’s curvature baker in real-time, too, so any curvature maps that use Mixer’s baker will pick up these details as you work on them, up or down the stack, so long as they’re visible and are generating normal data.
Let’s move on to the turbines. NACA ducts, as they’re called, are on the top of the engines. This is a unique detail you’ll generally only see in aircraft, although some high-end motor vehicles use this design as well. The ducts were designed in PS – at this point, I won’t need to go over the fine detail of construction as you have my PSD if you’re reading this document, and we’re quickly beginning to approach the entirely Mixer-based part of the tutorial, but this definitely bleeds over and I want to cover how this look was achieved.
The ducts are developed using paths which is par for the course up to now. What’s different is that the ducts use full metal value, black albedo, and a roughness value of 1 to simulate a dark crevice.
Although it isn’t physically accurate, that’s really just an academic point. What’s physically accurate isn’t always best. Sometimes you have to bend the rules to produce the desired result. Don’t be afraid to test things out. Go with what looks good. If it looks bad but is physically accurate, it’s OK to tweak things to produce a better result.
This concludes the Photoshop-centric aspect of this write-up. Let’s get into the meat of Mixer!
Read Part 2 of this tutorial here.
The original aircraft texturing tutorial by Jonathan Holmes can be accessed here.
You may find these articles interesting