In Part 2, Fernando Aguilera Reyes told us about the shaders in his Morning Witch project, explained the lighting and rendering setups, and showed how to make glowing cats.
Shading and Render Setup
This project is divided into 5 different color render layers, each with its own shader. I do this so I can have maximum control later in comp. Some of my elements (like aiToon and displacement) have a lot of randomness, and sometimes it’s just easier to delete or fix them later during compositing.
For shading, I duplicate my gray lightrig in case I need to tweak intensity or reposition certain lights. I also duplicate my existing geometries for each render layer. These geometries are never rendered together at the same time. I’m working with low specs, and this avoids catastrophic bugs when big material changes happen inside complex layers. In a professional setup using Gaffer or Katana, this kind of workflow is much simpler, and I wouldn’t need this workaround. But right now, I’m adapting to the tools I have.
Base
This is the simplest pass in the project. The shader uses the clean texture sets with no big adjustments. The only trick here is that the diffuse texture is also plugged into the emission attribute. This makes the look a bit flatter than usual and helps avoid dark spots without adding more indirect lights.
Triplanar Textures
Here you can see a projection texture connected to my ID1 (which I later named “placeBase”). Normally, I’d use this to modify displacement in my materials. In this project, I didn’t use it for the base, but I still exported it as an AOV in case it came in handy later in Nuke.
I group the projection node with a small loop animation so I can later add my other projection nodes into the same group.
Dots
This is where I start layering in the stylization using the full texture set. I didn’t change much in the specular or diffuse contributions, but I did play with the emission value a bit. Increasing it slightly makes the material flatter than the base layer.
In this pass, I also start working with masks for opacity and triplanars for normals and displacement.
Masks & Opacity
The image above shows what’s connected to the opacity attribute of this shader. The file node contains our mask01, which looks like this:
- Red → light dots info
- Green → dark dots info
- Blue → edges info
Next, I isolate the channels using aiShuffles. That way, I can separate the Red, Green, and Blue information into different nodes.
Then, I connect this alpha info into an aiLayer, which controls opacity:
Our Layer 1 is just a pure black color, since we only need it to carry opacity info for the dots. Layers 2 and 3 hold the actual dot data, so I’ll connect their respective aishuffles to the mix, set the operation to overwrite, and plug in a pure white color. If I want one of the dot layers to feel less noticeable, I can swap the white for a darker value, which makes that layer more transparent.
Layer 4 stays off for now, since its blue channel carries edge information that we’re not using yet. I still keep it connected, though; it’ll make things easier later if I want to duplicate this setup and tweak it further.
Masks & Displacement
Now we’re going to use an animated triplanar texture to affect our displacement geo. For the triplanar texture, I went with the size you can see in the image below.
Just like before, I connect the textures into aiShuffles, split them into layers, then connect them to an aiLayerRGB to modify the intensity of my displacement.
And now, we are going to connect our aiShuffles to our aiLayerRgb.
One big difference here: the base color is set to 0.500 gray. That’s because my displacement scalar zero value is 0.500, allowing movement both up and down. From there, each layer adds or subtracts tiny amounts of RGB info, creating nice random surface bumps.
Masks & Normals
The normal setup is almost identical to displacement, but with small adjustments.
I added an extra layer between the solid color (layer 1) and triplanars (layers 3-5). Layer 1 is just the base normal color (R.5, G.5, B1). Layer 2 is the original Substance 3D Painter normal texture. This gives me the option to keep or turn off the original values entirely.
On top of that, I mix in some gray colors to gently shift normal values. In realistic shading, you’d never touch the blue channel, but in NPR, I get to go a little wild.
For this project, the normal work is subtle. I only used 0.200 of the normal intensity overall.
Highlights
This pass follows the same logic as the dots render layer, with only small parameter changes. The key difference is that here I use mask02 and mask03 for opacity, plus a different triplanar size for normals and displacement.
Triplanars
Edges
Again, same general process. For opacity, I use the blue channel of mask01. For displacement and normals, I use an animated triplanar.
This pass has the highest emission values and the lowest specular contribution.
Toon Edges
This is the only pass that uses aiToon, and it’s rendered separately with special settings.
First, I change the filter type to contour and increase the width to 3.00. This makes the render use the edges’ width for alpha instead of the geometry alpha.
For shading, I connect the diffuse color of the All Texture Set to the edge color attribute. For displacement, I reuse the same triplanar texture as in the Edges shader so everything matches, but with less intensity since the aiToon is more delicate.
Render Layers
In the end, I split my scene into seven different render layers. The first two are a gray render and a wireframe pass for my breakdowns, while the last five are my color layers. The highlights layer was originally named “specs.” Once everything was set, I moved on to comp in Nuke.
Nuke
There are several steps in my comp process. In the very early stages, I just try to balance the base render layers with simple color adjustments made with Cryptomatte and color corrections/grades. The base and highlights layers carry most of the color balancing, while in the other layers, I try to reduce or remove elements that feel too distracting.
After that, I add some small edges in Nuke and comp all my render layers.
Light Passes
Now that I have a solid base, it’s time to add some interesting effects in Nuke. The most important effect here is the light passes. I apply the same method of isolating my RGB channels, but this time I switch between the three every 4 frames. This gives the texture a subtle animation.
The texture is isolated into shuffles and switched with different switch nodes every 4 frames.
I do the same for the light bleed texture. I use the white information as a mask and then modify several parts of my comp. This includes removing some elements from certain render layers or changing the overall color of specific objects.
Glows (or How to Make the Cats Part)
Here’s the part where we finally talk about the stars of the show: the cats. First, my contour edges done with aiToon weren’t working, so I had to create the ones for the cats directly in Nuke. Originally, this was just a placeholder, but the contours worked so well that I decided to keep them.
For the cats, I used a Cryptomatte to isolate the geometries I wanted to have a contour (B). Then I used a dilate node to expand their alphas (C) and subtracted my original alpha from it, giving me an external contour (D). Here’s how the nodes would look in Nuke (A).
I do that to the rest of the geometries, merge the contour alphas, and modify my general comp with a color correct to add the white lines.
Alphas
Now that I had a contour with some color, I isolated this part, added a glow effect, and merged it back into my comp. The nodes looked something like this:
Contour with glow effect
Merged back into the original comp
I applied this effect to other objects in my comp, too: hair, sparkles, fake light passes, etc.
And after all of that, I did one final pass of color corrections and balancing, and boom: the render is finally done!
Conclusion
This was a long piece to work on. It took me about a month and a half, broken up into different separate intervals, to finally finish it.
The biggest challenge was honestly keeping a healthy mindset while working on it. Even though I spent a long time on this piece, I try not to put too much pressure on a single project. I remind myself that I’m always working on multiple things at once. Of course, I want the final quality to be good, but it’s important not to be too hard on yourself. Let some things go, dedicate the right amount of time to each task, and always keep in mind that your portfolio is the big picture, not one piece that magically changes your whole career.
My advice for beginner artists: work on several projects at once, and with different levels of difficulty. Think about your portfolio as a whole, not as a single masterpiece that will change your life. I see a lot of people trying to create the one perfect project right away and then getting disappointed when it’s not flawless or takes forever to finish. Instead, treat projects the way you treat exercise: don’t fall in love with the results, fall in love with the process of practicing and building up your skills. The results will come naturally.
Have a mix of projects, some big, some small, so you don’t end up grinding every single day without a break. Just like with exercise, you need time to deload, then time to push hard. And one last thing: you don’t get to choose which projects become your best portfolio pieces. Some of my simplest renders have gotten way more attention than some of my most complex ones. So enjoy the process, whether it’s a small study or a huge project. Both are worth it.
Thank you very much for this amazing opportunity! If anybody has questions or just wants to chat about 3D, you can find all my socials here.
Thank you!