I am Gael Kerchenbaum, a modeler and texture artist specialized in creatures. I’ve been doing 3D as a professional for a few years now, but I decided pretty early to specialize on the organic side.
I am a constant user of XYZ displacement packs. To be honest, I embraced them as soon as they went out; they are now indispensable part of my workflow. I wrote the first tutorial to explain to artists how to combine XYZ files into one projection texture. Then I decided to put together this tutorial to share with you most of my creative process when it comes to creature making for VFX.
In this tutorial, I start by explaining to you how to get the most of XYZ files from a modeling point of view. We will then get to discover how we can use our displacement to help us create a full procedural texturing. And finally, we will get to a quick part on how to get everything to work for our look development creation.
Introduction to XYZ files
TexturingXYZ provides displacement resources as well as albedo, specular and specular roughness and even more data. This is one of the only website that provides references of pure color or accurate specular captured directly from the subject. A few Software allow to project both the color and surface information, like Substance Painter for example. However working in VFX ask a lot of resolution.
We will need a lot of UDIM. Unfortunately, Painter is pretty limited. Also, we cannot project everything in Mari because the software only allow a three channel paint through at one time. For this reason we can keep the albedo, specular and specular roughness maps for references.
The following working will explain you how to deal with the height and bump map in order to populate your models with details. We will then use these projections in zBrush to get be able to customise everything.
Put the Height in the Red channel. Put the Bump in the Green channel. You can keep the Blue empty, just fill it with mid grey. Or you can use one of the utility that XYZ provides. I like to use the cavities. I could use it later to create some masks for my albedo or my specular maps.
Cut the maps into smaller pieces to load them quickly in Mari. As a reminder, Mari does not allow to project file larger than 16K.
Processing our model (UVs, export)
I will use my t-rex for example for this tutorial. It has 12 UDIMs. The render has to size 12K, so I decided to create 8K maps. More is always better than less: it takes a second to downscale the maps in Nuke, however we can’t upscale them without lost.
Following is a screenshot of my UVs. Keep the aspect ratio across all the UDIM of a single object. Objects that are separated can use a different ratio. Even if my object are separated, I avoid overlap so I can get a clear sight on all my textures. This allows to import only one file node in Maya per map.
I create a Mari project and bring my body GEO.
In the image manager, I import the XYZ files that I previously proceeded.
I create one channel that I name mDisp, it stands for mari displacement. The channel is 8k, 16 bit minimum, sRGB with a 50 grey for base color.
The shader is set as following for a clear display in Mari’s viewport:
Albedo : Grey 50
Spec amount 1
Spec color : white
Spec roughness between 0.4 and 0.5
Use fresnel checked
Fresnel use iOR
Refraction : iOR set to 1.45
Bump value to 1.X, we can adjust it later
Plug your mDisp channel in the bump slot of your shader
Paint your displacement using Mari’s paint through. I do it on my baseDisp_LR (LR stands for paintable layer). Then I use a copy channel to display only the R channel.(displacement).
When you paint your displacement, switch between Flat and Shaded lighting mode. Shaded allows to see the volume, whereas the flat display will make you sure that you don’t leave any empty area in the map. Once done, you need to export the red and green channel separated. Isolate the red channel using the former Copy channel you created. Then do the same for the green channel by changing the copy channel to the correct input.
You are now ready to bring your high density details onto your sculpt. The next step will be to import and bake our maps directly in zBrush, so we can correct the high of our fine details.
This is how you can prepare your model for high res sculpting :
There are two ways of doing things here: either you decide to subdivide your model a lot, in order to reach about 40M polygons. Keep in mind that your zBrush may become unstable, save a lot of increments. The second option is to split the model into subtool per UDIM. It allows you to subdivide your model even more, in order to reach around 4 times the former polycount. You can reach around 160M poly for a single one geometry. There are pro and cons: the pro is obviously the total polycount that you can reach, the con is that you need to separate all body’s parts into different subtools. The seams may have to be cleaned later on. During this process I recommend you to always keep an eye on the task manager!
1.Keeping your mesh in one piece
Divide your model in order to reach around 40M polygons. Do not go too high, 100M poly for only one subtool may kill zbrush
Go on the lvl1 and do a polygroup per UV.
Go on the highest lvl, add a layer in record. ZBrush needs a white texture map applied on the mesh to bake the displacement. You can create a simple 8x8 pixels white texture in Photoshop for that. Import it in the texture tab. Then apply it as texture map on your subtool. If you want to see the colors of your polygroups again, active or not the texture color.
Do a CTRL + Shift + Click on the polygroup that corresponds to the 1001 UV tile.
Go in the texture tab, import your Mari displacement for corresponding tile. Select it and click on Flip V. Once flipped, click on your texture, and do a Make alpha.
In the geometry tab, locate the displacement slot. Select your map.
Click on Disp on, then rise the intensity at low value, 0.05 for example. Click on Apply. Keep this value in mind because you’ll need to apply it on all the UDIM.
Once done, perform a CTRL + Shift click on an empty space to recover your full model.
Keep an eye on your Task manager! If zBrush go crazy on RAM, go in the Edit tab, and click on delete Undo. Also, never forget to do a Quick save frequently.
You have to repeat the 5 former steps for all the other tiles. Then you’ll have all your displacement available directly in zBrush !
Create a new layer for each exported channel in Mari (Height and Bump)
2. Splitting into subtool per UDIM
Go on lvl 1 and do a polygroup per UVtile. Duplicate your subtool one time per polygroup.
Select the transpose brush and CTRL + Click on the polygroup that you want. With the paint select brush add 1 loop around your selected polygroup. Click on CTRL + W to create a new polygroup.
Go on the highest lvl and delete the lower subdivisions. Isolate the wanted Polygroup by doing a CTRL + Shift click on it. Delete the hidden poly in the geometry menu. You have to do that for all the duplicated geometry in order to isolate each UDIM as a single subtool.
Once done, recreate the subdivision levels.
Crease the border of your model. You can subdivide one or two more time each subtool.
Never forget to do a quick save! Keep an eye on your task manager, if zbrush starts to eat your RAM like candies, go in Edit and do a delete Undo.
Follow the Single mesh workflow from step 3. You’ll not have to import the displacement for the borders around your UDIM for each subtool. Instead, you will be able to recover the displacement for the other subtool by performing a projection.
I recommend to keep only one subtool per ZTL file. Otherwise, each time you’ll add a new layer to sculpt on you’ll double the size of the tool on the saved file.
You can now start with the sculpting magic. I only use basic brushes. The clay tube is my favorite. You can also use the Dam standard to dig deeper in the mesh, or the move to enhance the volume.
Always start by working on lower levels of subdivision, then move up slowly. If you don’t want to break the information of your bump layer, do not forget to hide it before you sculpt.
Once done, you can bake all layers if you want to preserve memory. Then, with the multimap exporter, export your displacement maps with the following settings :