Stylized art với Substance Paint và Arnold
Tham khảo tại https://www.allegorithmic.com/blog/substance-painter-arnold-ultimate-guide-olivier-couston
If like us, you are a fan of stylized art, you have to know Olivier Couston. His portfolio and the list of the projects he has been involved in are simply stunning. The overall composition and the texturing work are so perfect that you often have to look twice to make sure it’s not 2D concept art. For our immense pleasure, Olivier recently decided to switch to Substance Painter for his texturing process, and he was kind enough to share his experience with us.
After the interview, don’t miss Olivier’s in-depth tutorial on texturing and getting your model from Substance Painter to Arnold.
Hi Olivier, thanks for taking the time to answer our questions. First things first: can you introduce yourself to the Allegorithmic community?
Sure. I’m 34 years old, from France but have been living in Belgium for the past six or so years. I was introduced to 3D modeling back in high school, in the late 90s, with 3ds Max 2.0. I had no idea of what I was doing: there were no tutorials back then. I studied computer science and worked as a software developer for four years while I kept doing 3D stuff for fun, still in 3ds Max.
In 2007 I was approached by Blur Studio to do some freelance work. That’s when I realized I could actually make a living from something I enjoyed more than my current job at the time. I kept doing some freelance work and in 2010, I was hired by nWave Digital in Brussels to work as a character modeler on animated features. Since then, I have been working in several studios in France and Belgium, doing all sorts of modeling and lately I have been taking shading more seriously.And that’s how I got into Substance Painter.
When we look at your characters, we can almost feel their personalities through their look and their pose. Do you follow any rules or guidelines to bring this emotional level to your art?
Most of my personal work is based on other artists’ concepts. There are tons of great concepts I’d love to make in 3D but there are only 24 hours in a day, so I have to be very selective. When I pick one I really like, I ask myself, “Ok, what makes this one so special, what is it that I like so much about it?” Once I have spotted that shape, that particular face, or a dynamic pose, I really try to focus on it and make sure I don’t lose it during the many iterations of the modeling process.
Then there are other tricks, like “taking it to 11”. For instance, when I make a correction in a sculpting program, whether it’s fixing some proportions, emphasizing an expression, or just modifying the shape of a nose, I make that modification on a layer. When I’m done and feel satisfied with the result, I set this layer’s influence to 150%. It will exaggerate the modifications I made. It won’t always look perfect as-is and may very well break some stuff, but it will also highlight the areas where I have been too shy and could have pushed a little more. But overall, the key is to not lose focus on what makes a character interesting.
You manage to jump from a handpainting texturing style to realistic rendering work. How do you decide which look you are going to achieve in your personal work, and are what the challenges for each of them?
It really depends on how stylized the model is. I always try to put a bit of texture in the skin or cloth even if it’s super cartoony to give it some substance (pun intended), but I’m not going to add skin pores, wrinkles and moles if the face does not even have nostrils or ears modeled; it would look awkward. It’s about finding that balance between “believable in its own universe” and “realistic”. It also brings us back to the previous point: “What is it I like about this concept?”. If it’s the anatomy and the level of detail, then I will give it a more realistic treatment. On the contrary, if it’s the shapes and how simplistic it looks, then I’ll have a more stylish approach. And since I’m more into cartoon than super realistic paintings to begin with, so I tend to go the stylized way.
You recently jumped onto the Substance Painter wagon. What’s your overall feeling about the software? What does it bring compared to your previous workflow?
I may sound biased, but it really took my shading skills to a whole new level. Before I would just paint a diffuse map (in Mudbox generally) and that was about it. Painting a roughness map would scare me. I know what it was supposed to look like, dark is glossy, white is matte. But making it actually work requires a lot of back and forth between Mudbox and Maya, with a bit a of Photoshop in-between. Personal projects are about learning new stuff but also having fun. Spending three days trying to get that specular right is not. So I would end up using a procedural map, add some SSS and call it a day. In Substance Painter, I can paint all these maps at the same time, with real-time visual feedback, no guesswork. And I don’t waste any more time with test renders. I just export the maps with the Arnold preset, plug them in the right places, and voila. I work faster and get better results.
What are your favorite features?
Fill layers in general. I love this non-destructive workflow. it’s awesome to just create a layer with a mask and then being able to adjust its color, roughness or bump at any time. You can really decompose materials on a physical level: “Base is metal, then I have a layer of paint, then some rust and on top of that some dirt.” And to stay in the non-destructive workflow, being able to losslessly change resolution at any time is a big time-saver.
I also like that you are not limited to a procedural or a manual workflow, but that you can combine both on the same mask. Sometimes I find the perfect setting for my mask builder, but there is that one little spot I don’t like. Rather than trying to figure how to get it right for another hour, I just add a “paint” on top of it to do some manual touch-ups in five minutes.
Smart materials are also great for being able to transfer your hard work from one model to another in just two clicks. It’s also a good way learn from other people. I have downloaded some smart materials from Substance Share and then looked at what each layer did and how it was built.
Finally, the fact that it does not rely on topology. You can modify your model, even at a topological level, and still preserve your work. You can even modify your UVs: just re-bake your maps and you’re all set. Very useful when working in production.
Overall, I think I have only scratched the surface. I discover new things every day. Just this week I accidentally found about the different brush projection methods, and it made my life a lot easier.
Could you cite one digital and one traditional artist who are a source of inspiration for you?
It’s really hard to pick just one of each. But for digital, I’d say Pascal Blanché. I have been following his work for over 15 years. He has such a unique style and it’s not just a gimmick. He is probably the only 3D artist I can recognize the work of by simply looking at a thumbnail. I would not mind hanging one of his artworks in my living room.
For a traditional artists, I hesitated between many, but I picked Olivier Vatine, because he was already my inspiration 20 years ago. He is a French comic book artist but I think he also worked on movies and video games. His line style is amazing and he was very ahead of his time. And he draws naked ladies like no one.
What do you do when you don’t sculpt?
Lately, I have been learning how to mold and cast, to make actual live props. I don’t have much to show yet, but I have something pretty cool in the making, which I’ll post on the usual sites when it’s done. My girlfriend and I also like to build and repair stuff. Furniture, electronics or whatever. We have to keep ourselves busy in cold and rainy Belgium. I don’t play many video games, I least not as much as I used to, but lately I have managed to find time to play Overwatch. I fell in love with the art style when I saw the very first trailer and the game itself are tons of fun.
Now it’s time for sharing some skills. Olivier was kind enough to offer to retexture one of his old creations with Substance Painter! Take a look at the breakdown just below.
A bit over a year ago, I modeled this character Justin the White Knight, based a great concept by Johannes Helgeson:
It was rendered in Arnold. The shaders and textures were pretty simple but did the job. The armor was just a base color on which I applied a cavity map, baked from the sculpted details. And the bronze is just one material, no textures. Now that I know how to use Substance Painter, I wanted to see if I could do a better job, without spending too much time.
Preparing objects for export
So I dug out my old scene. As an exercise, I modeled it like it was for an animated production. It’s not just a quick sculpt, everything was modeled properly to be skinnable, the details are done with displacement maps and the face topology should permit blend shapes.
I had also done a sculpt pass, which I will also reuse. Now, one could argue that this sculpt only contains scratches and surface details and that such things could be generated directly inside Substance Painter. It’s true and had I not already done it, I would have probably tried to do it in SP first. But since I have already extracted the displacement maps, I’m going to keep it as-is.
I’m only going to deal with the armor at first, as I’m not sure if I want to re-texture the head. I’m pretty lucky that I had already split the materials of the armor on separated UV tiles. This will allow me to treat them as individual texture sets in SP. The first tile is the white metal, second is the bronze rims, and the third is the inside of the armor.
Now I have two options, importing the low poly model in SP and baking the maps using the sculpt as high poly or paint directly on the sculpt itself. The first approach is better if you are working on a real-time model, but it’s not the case here and I’m a bit lazy, so I’m going to import the sculpt directly in SP. But I’m going to decimate it first, in Maya (Mesh>Reduce), making sure I preserve the UV borders.
The amount of decimation depends on how heavy your mesh is. I use values between 80% and 90%, meaning my mesh will only have 10-20% of the original amount of polygons. You can also do it ZBrush, and it’s probably faster. It’s ready to be exported to Substance Painter. I apply a single material to all the armor parts and export it to .fbx.
Importing objects in Substance Painter
In Substance Painter, I create a new project, select my .fbx as input mesh and I check the “Create a texture set per UDIM tile” box. This is very important, but you only need to do that if your UVs are indeed spread across multiple tiles. As a result, SP creates three texture sets, one for each UV tile, and automatically named them with their UDIM value:
Baking utility maps
Next, we are going to bake the textures SP needs to do its magic (ambient occlusion, curvature, normal…). I set the bake resolution to 2048 because 4096 generates much bigger files and are not always needed. I can always re-bake them later at a higher resolution if necessary. I also found out that some textures like Position or World Space Normal don’t have to be super high res, you can bake these separately at 1024. The only map that really benefits being baked at a higher resolution is Curvature.
I uncheck Normal and ID because we don’t bake from a high poly and we haven’t painted vertex colors.
For the Ambient Occlusion and Thickness maps, I set Self-Occlusion to “Only same mesh name” because I don’t want armor parts to cast shadows on each other. Since those maps are used to generate dirt masks, it would create dirty areas that would not make sense once you pose the character.
Don’t forget to click the “Apply to all” button when you modify any parameters, so it affects all the texture sets.
Blocking basic materials
When the baking is complete, the first thing I do is applying temporary materials to each texture set, using Fill Layers. They correspond to the blocking step when modeling.
This way, while working on one texture set, the others are not just plain white and it helps to get a better overall idea at early stages. You can also use this step to create your first groups and masks if needed. In our case, the white and bronze parts of the armor are on separate texture sets so we don’t need any masking, but hadn’t it been the case, I would have created a mask for the bronze material, using Polygon Fill, in UV shell mode.
For the white parts, I want a sort of pearly coating, so I added some metalness, around 0.7 while increasing the roughness to 0.6. And of course, the color is not pure white, it’s a light tan with a touch of red. For the bronze, I picked a brownish color, set metalness to 1 and roughness to 0.3. Keep in mind this is just a placeholder, we will come back to it later. For the inner part of the armor, I have put some velvet/silky red, because why the heck not. Just like for the pearly effect, I added some metalness to get the silky look, only this time I set it to around 0.5 and set the roughness around 0.4.
Creating a Paint Chip Effect
I’m going to start with the main tan material. The first thing I want to do is creating a chipping effect in the paint/coating. So I am going to create the metal that’s supposed to go underneath. Except I’m going to create this layer on top of the base one (it’s easier this way). I want a shiny metal, but it’s supposed to look medieval, so I don’t want chrome either. So I create a fill layer, I set the base color to a gray value of 0.2, roughness to 0.25 and metalness to 1. I don’t mess with the height yet and I get something like this:
I could already start adding wear and dirt, but this material is only going be seen through small paint chips, so it’s not worth the trouble.
To create said paint chips, I am going to use the Edge Strong Smart Mask as a starting point.
It’s a pretty simple mask, as it’s made of single a Mask Editor generator, driven mostly by the curvature map. I could have created it myself from scratch, but smart masks are here to save us some time. I generally test a few masks, narrow it down to two or three and eventually mixe them if I can’t decide which one to pick. I rarely use them as-is, but they definitely make a good starting point and can help finding a direction.
I like this weathering effect, but it is obviously way too much, I want it to be more subtle. I do this by editing the generator settings. First I adjust the Global Balance and Global Contrast, then I expand the Curvature tab and fine tune, using the Sharp, Fine and Soft sliders.
Now there is one issue. The fingers are all metal, the paint is all gone and I don’t want that. The armor must look slightly used but not too much. No matter how hard I try to adjust the mask, I can’t get the fingers right. The only way I am able to get the paint back on the finger is to adjust the balances so low that the metal disappears from the rest of the armor. Even adjusting the mask levels does not work.
So after much tinkering, I decide to correct it the brutal way: manual touch-up. There is no point wasting 20 minutes to find the perfect mask setup for something I can fix manually in 2 minutes. I right click on the mask which contains the generator and add paint. This allows me to paint directly on the mask, a great way to combine procedural and manual workflow. I am going to paint the fingertips with black, overriding the generator’s effect. I use the Fill Polygon tool to quickly paint the phalanges in one click and then use an artistic brush to paint off some chips.
The next step is to add some depth to this material. I’m going to give some negative height to the metal layer. To get a better preview, I temporarily switch the texture set resolution to 4096. I want it to remain subtle, so I only the height to -0.02.
Now I want to add some texture to the paint itself, with some grain. I create a new fill layer that I move between the paint and the metal materials. I disable every channel except for the Height, which I set to 0.01(you can use a higher value for a more pronounced effect). I add a black mask to this layer and add fill to this mask. In the Grayscale input, I add a procedural texture named Perlin Noise Zoom. I set the Distance to 64 and the Disorder to 74 (don’t ask why; these are just values that worked for me). Finally, I use the UV scale to adjust the grain size, the higher the value, the thinner the grain will be. In my case, I used a value of 36, but it really depends on your model’s UVs.
Looks better but it introduced a new problem: the grain is also visible on the metal. We must tell the metal layer to override the Height from the previous layer. To do this, we must change the layer’s blending mode, on the Height channel, from Linear Dodge to Replace:
As a result, the value -0.01 from the metal layer replaces the grain from the base layer, instead of summing them together. The grain is no longer visible in the metal but still in the base paint.
Let’s add more texture. Grain is a good start but it’s a bit boring. Let’s play with the specular roughness now.
I’m going to add random scratches with a simple Fill mask, no generator. Again, I start by creating a new fill layer, between the existing bump and the metal layer. I want it to affect the specular only, so I disable the color channel. I set the Roughness to a high value and reduce the Metallic to zero. This will contrast with the shiny aspect of the base material. I add a black mask to this layer and add a Fill, by right clicking on the mask. In the grayscale input, I plug the procedural named Grunge 012, but you can pick another one, whatever suits you. I press the invert button, so the scratches become white in the mask and then adjust the repetition using the UV scale slider to 8. Now that I can see the scratches, I lower the Base Color layer opacity to around 25 to make them less visible in the diffuse. As an afterthought, I also want to give these scratches a very slight depth. I go back to the fill layer and set the height to -0.01.
As you can see, it’s a subtle effect, affecting mostly the specular. Now let’s make it dirty. I’m not going to go as much into detail for these since I mostly used Smart Mask presets.
The first layer is going to be mud, big chunks. I used the Dry Dirt smart mask and lowered its Global Balanceand Contrast to around 0.5. The layer itself is dark brown, high roughness and 0.4 of height.
Next is small dirt splatters. For this one, I used the Spots smart mask. This mask is composed of a Generatorand a Fill. I deleted the generator and increased the procedural disorder in the fill. Again, the layer is brownish, with a high roughness and a bit of height.
The third layer is dust. Again, I use a smart mask, Dust Stained, without even modifying it. I set the layer color to a dark poop green, and lower its opacity to 40. The reason I do that rather that lowering the mask’s global balance is because I only want the color output to be lowered while maintaining a high roughness value, which I set to 1. No height this time, as this is just a thin layer of dust.
Finally, I add a last layer of dirtiness using the Dust Occlusion smart mask. I play with the properties (contrast, level, grunge amount…) to get something a bit sharper and fingertips located in the cavities only. Again, no height, only dark color, and roughness in the layer itself.
Moving Onto the Bronze
I’m pretty satisfied with the white part, for now, I’m going to move to the metal. The first thing I’m going to do is upgrading my basic metal layer with a pre-made substance, Bronze Yellow, found on Substance Source. It adds a little bit of noise. Then I create a new layer to add some wearing on the edges with the Smart Mask Edge Damage. I set the edge layer to be a bit brighter, have a little bit of roughness and a very low negative height. Finally, I simply copy the dirt and dust layers from the white armor and paste them on the bronze to get a matching look.
Finally, I do the last adjustment pass, where I tweak a bit everything. Colors, roughness, layer opacity, levels, blending modes, manually correct masks…
The main noticeable difference is the overall color saturation. The original was a bit bland, so I gave it a slight orange/pink hue. I added more dirt on the feet, using the Ground Dirt smart mask. I tweaked the chips mask, so there is a bit less metal visible. Finally, I reduced the grain’s height because it was a bit too present in close up.
Also, before exporting the textures, I re-baked all the maps in 4k for a sharper result.
Exporting the Textures for ALSurface Shader
Now we are ready to export the maps. We are going to render it with Arnold in Maya 2017. I am not going to cover how to export and plug maps for Arnold Standard Shader, as this is already very well covered in the documentation. Instead, I will cover how to export to the AL Surface Shader, from the ALShaders library. These are custom shaders for Arnold written by Anders Langlands. They are often used in movie productions because they are more physically accurate and offer a lot more control than the standard shaders. The subsurface scattering works much better (I personally was never able to get the SSS to work properly in the Arnold standard shader.) They come with a bunch of built-in AOV channels, also very useful in production. And last but not least, they are free, regularly updated and easy to install.
But their specular work a bit differently from the standard shaders and requires a slightly different map setup when exporting from Substance Painter.
First, we are going to create a new export preset. In the Export Textures dialog, click on the configuration tab, right click on the Arnold UDIM preset (because in our case we have several UV tiles) and select duplicate. It will create a new preset named Arnold UDIM_copy at the bottom of the list. Double-click on it to rename it ALSurface.
We are no longer going to need the f0 map, but the Metallic instead. Since both maps are grayscale, you don’t need to create a new map, you can replace the f0 input with the Metallic. Just drag Metallic from the map list, and drop it on the Gr icon where the text input is “$mesh_f0.$textureSet”. When you drop it, pick “gray channel”. Now you can just modify the input so it says “$mesh_Metallic.$textureSet”.
I export both the Normal and Height, it does not really matter which one you want to use since there are no baked normal details, the result will be very similar. Normal maps should be enough, but its intensity cannot be adjusted in Maya, while regular bump map can be. So it’s good to have both options. You’ll notice I have left the Emissive, even though our model does not have any. I will need it for the sword’s glowing blade. I will get back to it later, I simply forgot to include it when I exported the armor’s mesh. The exporter will simply omit this map for now.
Now I can go back to the Export tab. I make sure to select the ALSurface preset I just created. I set the format to EXR (you can also use TIF) and the color depth to 16 bits. This is is important for Height and Normal maps. If you export them in 8 bits, you will lose the negative values. I export the main tile in 8k. This may seem like overkill, but I noticed the main material is a bit blurry, compared to the bronze, when seen in close-up.
Setting Up Color Space
Once the maps are exported, we jump to Maya. The first thing we want to do is set the color space to linear sRGB because Substance Painter does output linear maps. This done differently depending on your version of Maya.
In Maya 2017:
It’s simple –just open the Preferences window:
In the Preferences window, click on Color Management in the list on the left side. Then check Enable Color Management and make sure the Rendering Space is set to scene-linear/sRGB and View Transform is set to sRGB Gamma.
You have to do this for every new scene, which is annoying, but at least it’s saved in your scene setting, so you don’t have to redo it when you re-open it. That’s it for Maya 2017.
In Maya 2015/2016:
Supposing you are already running Arnold, open the Render Setting window, set Arnold as the renderer, and go to the Arnold Renderer tab. Extend the Gamma Correction panel (this panel is absent in Maya 2017) and set all the Gammas to 1.
Then you must set the image color profile to Linear sRGB. You can access it by opening the render window, then clicking on Display>Color Management.
It will open the color manager in the Attribute Editor. Select Linear sRGB for Image Color Profile.
That should be it for Maya 2015/2016.
Converting textures to TX format.
Next, we want to convert our textures to TX format. I will not go into the specifics because I don’t want to give wrong information, but it has something to do with mip-mapping, which is more optimized for Arnold. When converted, textures load much faster than regular TIF or EXR, reducing render times. I am not sure if the EXR generated by Substance Painter are already tiled and mip-mapped. If it is indeed the case, then the conversion to TX is not mandatory. But when in doubt, regardless of the format (.tiff, .png, .jpg…), it’s always a good practice to convert textures to TX when rendering with Arnold.
There are two ways to convert textures: first is to assign the textures as regular EXR and then use the TX Manager to convert the scene textures to TX (but then you have to go through each texture node and replace the EXR with the newly created TX manually). Or, much faster, use the TX Manager to convert all the image files in a specific location to TX format, then assign those textures directly.
You can access the TX Manager from the top menu in Arnold>Utilities>Tx Manager.
In the TX Manager window, select “Use Textures in Folder”, then browse to the textures’ location (I just left them in the Substance export folder), click the Create .tx button and wait until the Created counter reaches the end.
Flushing Texture Cache
If at any point you modify and re-export the textures from Substance Painter, you will, of course, have to update the TX files too. The maketx script only creates TX files if they don’t already exist, it does not overwrite existing ones, so you will have to delete them first. If Maya is open and the textures are already loaded in memory, you won’t be allowed to delete them. You have to flush the texture cache first. To do so, just do Arnold>Flush Caches>Textures.
Then you can delete the assigned TX, and use the Tx Manager to generate them again.
Creating the ALSurface Shader
Make sure the ALShaders are installed correctly. I will not explain how to do it, the provided readme file does that very well. Don’t worry; it’s not too difficult. You just have to drag and drop files into the designated folders.
You will have to create one shader for each Texture Set you exported, unless, like in our case, each Texture Set represents a UDIM tile for a single shader. Select all the objects corresponding to your first Texture Set in Substance Painter (again, in our case, all of the armor parts), maintain right click over them and select Assign New Material in the drop-down menu. In the new material browser, select Arnold>Shader in the left column and select alSurface in the list on the right.
The newly assigned shader will appear in the Attribute Editor. Make sure to give it a proper name for future reference. The channels that we are interested in are Diffuse Color, Specular Color, Specular Roughness, Index of Refraction and Bump Mapping. Make sure the Diffuse and Specular strength are set to 1 by default.
Assigning Diffuse and Specular Colors
Since we are working in linear sRGB, the diffuse and specular colors need to be gamma corrected. We lowered to the overall gamma correction from 2.2 to 1. So we must compensate this correction in our textures. We can use the existing Gamma Correct node but I prefer to use the alRemapColor node, bundled in the alShaders library because it offers many more controls like gain, exposure, saturation… And you only need to correct gamma globally, not on each color channel.
In the Hypershade, the alRemapColor node is available in Arnold>Utility.
Just click on it to create a new node. Once created, in the Attribute Editor, set the Gamma value to 0.454. Why 0.454? 0.454 * 2.2 = 1.
Now we can put our texture in the node’s input, click on the checkerboard icon next to the input slider.
You can use a regular File node, but I like to use the simpler aiImage node, and this way, we stay 100% Arnold 🙂
In the aiImage node, click on the folder icon, go to the folder containing your texture files converted to TX format. Then select the file corresponding to the diffuse color for the first UV tile, which should have 1001 in its name.
Once selected, in the text input containing the file path, replace 1001 with <udim>.
For instance, my original file name was justin-armor-diffuse-1001.tx, now it’s justin-armor-diffuse-<udim>.tx. When rendering, Arnold will replace the udim tag with the corresponding value for each UV tile.
Now plug the output of the alRemapColor node into the shader’s Diffuse Color input.
Repeat the exact same steps for the Specular. Of course, you must select the file corresponding to the specular instead and plug the remapColor node in the shader’s Specular Color:
Assigning the Specular Roughness
The specular roughness map does not need to be gamma corrected because it’s not actual color information, but a gray value representing roughness between 0 and 1. In the shader’s specular properties, click on the checkerboard next to the roughness slider.
It will open the node browser, select the aiImage node again.
This will bring up the Connection Editor because Maya does not know how to connect these two by default. The image default output is an RGB value, while the roughness input expects a single value. The simplest way is to link only one of the RGB channels to the roughness. It does not really matter which channel you pick, they are identical since it’s a grayscale map, but for this example, we’ll pick the red channel.
In the left column (the outputs), click on the plus sign next to outColor, and select outColorR. In the right column (the inputs), select specular1Roughness. That’s it, you can close the editor.
Don’t forget to assign the roughness map path in the aiImage node and to add the <udim> tag!
Assigning the IOR
Ok, this is the tricky one. Remember when we exported the metallic instead of the f0. It’s because the alSurface shader does not have an f0 channel. The Fresnel is controlled by the Index of Refraction. The IOR is just an alternate way for metalness to control the material reflectivity. If metalness goes up, so does the IOR, so we can use the metallic map here. The problem is that metallic value goes between 0 and 1, IOR goes between 1 and … I don’t know, by googling, I could find materials with values as high as 4 and then something called metamaterials with values higher than 30, so I don’t really know. The point is, we have a map that output values between 0 and 1, while IOR should not go below 1 (1 is the IOR of vacuum). So we are going to use an alRemapFloat node, to remap the values. I don’t have magic numbers, but by tinkering, I found that for solid materials, setting the range between 1.4 and 20, I get results close to the Substance Painter viewport. I can alway fine-tune it after.
So let’s click on the checkerboard next the IOR input in the specular Fresnel tab:
In the node browser, select alRemapFloat in the Arnold>Utilities category:
In the Attribute Editor, expand the Remap tab. Leave input min to 0 and input max to 1. Set Output min to 1.4and Output max to 20. Keep in mind, these values are just a starting point. We can always edit them later if it looks overexposed or too flat.
Uncheck the Enable box in the Clamp tab, or it would render this node useless.
Finally, click on the checkerboard next to the Input field at the very top of the node, select an aiImage node (you should know where it is now 🙂 ) and connect the outColorR to input.
In the aiImage node, select the metallic texture map and replace the <udim> where necessary
Setting Specular Distribution
The important setting, easy to miss, in the specular panel, there is an Advanced panel, closed by default. Expand it and change the distribution from Beckmann to GGX, as this will match the Substance Painter viewport better.
Assigning Normal Map
The final map we need to plug is the normal. Just expand the Bump Mapping panel if not already opened and click the checkerboard icon.
Select an aiImage node. The attribute editor should not take you directly to the aiImage node but to the *bump2d** node that is created between the shader and the texture. While you are on this node, change the Use As: value to Tangent Space Normals. Expand the Arnold panel, and uncheck Flip R Channel and Flip G Channel.
Then click on the icon next to the Bump Value to access the aiImage node, and enter the Normal map texture file. Again, replace the <udim> where necessary, you know the drill now.
If you had extracted displacement maps, now is the time to add them. Select the Shading Group your shader is linked to:
Then in the Attribute Editor, click on the checkerboard next to Displacement mat.
In the node browser, select an aiImage node. Like for the normal map, you will not be taken to the image node directly but to the DisplacementShader first.
If you are using regular displacement, you don’t have to do anything.
If you are using Vector Displacement, you must set the Vector Space to Tangent, break the connection between the aiImage node and the displacement input, and plug the aiImage in the Vector Displacement instead.
Then go to the aiImage node, assign your displacement/vector Displacement map, make sure you converted them to TX, and as usual, replace the <udim> tag where necessary.
Enable Arnold Subdivision
In order to make the displacement work, or just for the model to look smoothed, you must enable Arnold’s subdivision.
If you don’t have many objects, you can do so manually for each object by selecting it, selecting its shape node in the Attribute Editor, opening the Arnold panel, then in the subdivision panel, select type: catclark and set the number of subdivisions to whatever you want.
You don’t have to subdivide a lot, even if your displacement was sculpted using many subdivisions in ZBrush. Arnold uses a feature called auto bump where bump-mapping kicks in to compensate the lack of mesh resolution to render smaller details from the displacement map. So, sure you can match the same subdivision level as your sculpt, but you can often get away with a very close result for a fraction of the polygon cost.
If you have many objects and going through each one by one to enable the subdivision sounds too much of a hassle, you can do it quickly with the Attribute spreadsheet.
Select all your objects, press the down arrow on your keyboard to select the shape node for each. Go to Windows>General Editor>Attribute Spread Sheet.
In the Attribute Spread Sheet, click on the “All” tab. Enter subdiv in the filter field, it will help you to quickly find the attributes Ai Subdiv Type and Ai Subdiv Iterations. Click on the column header Subdiv type and enter the value 1, it will set everything to catclark. Click on the header Subdiv iteration and enter how many subdivision levels you want to apply to your objects.
Matching Substance Painter Lighting
The best way to make sure your shader is properly set is to compare the render result under the same lighting condition as in Substance Painter. We are a going to use the same HDR map we used in SP.
For this, in Substance Painter, check which HDR you used, in the Viewer Settings tab. In our case, we used Panorama, which I believe is the default one. In the Shelf, click the Environments Sub-Shelf, right click on the panorama map (or any other map you used) and select Export Resource…
Select a folder, and Substance Painter will copy this HDR in it.
Now back in Maya, create a skydome light, in Arnold>Lights>Skydome Light.
Since the original HDR resolution is 2k wide, I increased the light’s resolution to 2000. I also increased the samples to 3, to get less grainy shadows and finally I click on the checkerboard next the Color, to assign an aiImage. I select the HDR file I just exported from Substance Painter.
Finally, for an even better match, I can add this same map as a background image. To do this, open the Render Settings, click on the Arnold Render tab, scroll down to the Environment panel and open it. Click on the checkerboard next the Background, and select Create Sky Shader.
The aiSky shader appears in the Attribute Editor. We want to assign the HDR map in the color, but we are not going to create a new aiImage, we are going to link the one we created for the skydome, this way if we want to change the HDR, we only have to do it in one place.
Open the Hypershade, click the Textures tab, find the one corresponding to the HDR, and without selecting it, click and hold the middle mouse button, drag and drop it onto the Color channel of the aiSky shader in the Attribute Editor. Then, in the Render Stats, uncheck everything except the Primary visibility.
We are almost done. The last thing we want to do is parenting the sky transform to the domelight, so that when we rotate the light, the background rotates too.
In the outliner, with the middle mouse button, drag and drop the node transform1 onto aiskyDomeLight1. Now transform1, which is the transformation for sky shader, should be parented to the skydome
For a perfect match with Substance Painter’s zero position of the HDR, set the Y angle of the domelight to -90.
Rendering and Fine-Tuning
Before hitting the render button, we need a reference mark. For comparison, we’ll use Substance’s integrated Iray renderer instead of the real-time viewport, because it works more similarly to Arnold: global illumination, radiosity, soft shadows, so the results should be more comparable.
So in Substance Painter I press F10 to go to rendering mode. In the viewer settings, I set the dome type to sphere and disable the ground plane so it matches Arnold’s setup even more. I let it render for 5 minutes and here is what I get:
Ok, now let’s render in Maya with a similar camera angle…
Except for the background image which wraps differently, it’s hard to spot any difference. Now granted, it is a bit overexposed in some areas, in both renders, something that was not happening in the realtime preview. You can fix that two ways. First one, simply adjusting the specular properties in Substance Painter and re-exporting the maps. In a production environment, you probably want to do that. However, if it’s just for a one-off image, you can just play with the min and max output of the alRemapFloat node, the one that controls index of refraction, or you can even reduce the overall specular strength, but that’s cheating 🙂
Fk, I Forgot the Sword**
Yes, I mentioned somewhere “we’ll see the emissive channel with the sword”, but I totally forgot about it… So I exported the sword in a different .fbx file. But I want the guard and the pommel material to match the bronze of the armor. Easy, I just export the bronze as a Smart Material.
In the armor scene, I select the texture set that contains the bronze. I create a new Layer Folder, I drag and drop all the layers related to the bronze aspect (base, edges, dirt…). Give the folder a name so that you can easily find your material later. Then right-click on the folder and select Create Smart Material.
Now I can create a new scene with the .fbx containing the sword object and bake the utility textures. If I go to the Smart Materials sub-shelf, I can find my bronze material:
I just have to drag and drop it in the layer stack of my texture set. Then with some simple masking, I apply a chrome looking material for the blade and leather to the handle.
Adding Emission in Substance Painter
The sword is supposed to be glowing with blue magic or something like that. We are going to add an Emissive channel to the texture set.
In the texture set tab, click the plus sign next to Channels, select Emissive in the list, and voila.
Now with can create layers with Emissive. First I add a layer with all the channels but the emissive disabled. I set the Emissive color to a teal-blue.
It’s a bit too glowy:
So I add a mask to this layer, using the baked Thickness texture as grayscale input in a Fill.
It already looks much better – looks like an icicle!
Now I want the edges to be brighter, so I create the second layer on top of that, also only affecting the emissive channel. I set the emissive color to a bright teal:
In the mask, this time, I add one of Edge Smart masks, I believe Edge Strong, then I add a blur filter on top of it, then on top of that I add a Fill, set to multiply, in which I put the Curvature texture as grayscale input.
This creates a soft glow on the edges, thanks to the blur, with a sharp, bright pass on top of it, with the curvature map in multiply mode.
I’m calling it done. Now you can export the textures. Just make sure you included the Emissive channel in the preset configuration.
Adding Emission in Arnold
Now back in Maya, it’s pretty straightforward, convert the maps to TX, create a new alSurface shader, assign the other textures like we saw previously (Diffuse, Specular, Roughness, IOR, Normal, set distribution to GGX).
The new stuff is the Emissive. In the shader settings, there is an Emission panel. Expand it. Set the strength to 1. Next, we want to plug the emissive map to the Color channel, but we must gamma correct it, just like the diffuse and specular color.
So we click the checker icon next to the Color and select an alRemapColor node, set the gamma to 0.454 and add an aiImage in the input, where we select the sword’s emissive texture file.
If we do a first test render, the result looks a bit dull 🙁
Let’s try boosting the Emissive Strength a bit. If we set it to 3…
That’s already much better. I think it needs to be adjusted depending on the light setup.
Wow you really read all of this? You must be quite a Substance Painter fan 😉 See you in the next tutorial!