Work In Progress / 31 August 2024

FFIXR Tribute | Week 4 - Materials

Hi all! Back again to this week's update on my personal project tribute on Final Fantasy IX!

This time I'll walk through my material setup. As I mentioned early on, Spiderverse, Arcane, and Alberto Mielgo has been a huge inspiration for the look that I'm going for, which I feel fits the storybook feel of Final Fantasy IX.

Now this means I'll either need to manually paint each assets, or I can try creating a procedural material in engine. This video in Blender seems to be close to what I'm going for: 

Unfortunately a lot of the blender nodes doesn't work 1:1 in Unreal. While we do have a few ways to generate noise procedurally in engine, they can't really be used straight up into the normal. I tried using a few options in engine like the height to normal chaos node, but they don't look as nice as I wanted. After days of trying to replicate that shader entirely procedural in engine, I gave up and decided to create a procedural brushstroke texture that I can control later on. This video made in substance designer seems to be pretty close to what I'm going for too:


With that being said, here's how my substance designer graph looks like:

Basically I made a bunch of tileable brush stroke textures that I then packed into the RGBA channels and export that as .tga. I split the R/G/B/A as Low/Mid/High/Overall frequency coverage of the brush strokes. Now that I have them, I started creating a Material Function so that I can just add it into my main shader later as a layer. Nothing complicated, I just lerp 4 kinds of textures using a triplanar material function that I created.

 Here's my triplanar material function if you're curious:

It's nothing fancy, but it helps simplify my material setup. Now that we have these material functions done, we can finally work with the more fun stuff, the brush stroke textures. I exported a normal data out of substance designer of a general brush stroke texture. I kinda mimic the procedural setup done in Blender earlier, with the main difference being the lack of normal output out of noise nodes in engine.

I did try using the Height to Normal Chaos node, but the output looks very pixelated and antialiased. So I faked it by turning the noise into a lerp alpha that switches between a flat normal and the brushstroke normal. This creates an interesting yet subtle details that I like. Combined with the base normal that I baked out of Zbrush, it makes for the main foundation for the master material.

Once that's done, I added the basic megascan standard surface into the master material. The idea is that each assets can have a PBR material as a base, and then the brush strokes will come as a layer on top. So here's how the all come together in the material:

You probably noticed some material functions that I forgot to show. One is a Curvature material function that I found on epic forum. But here's the snippet of it:

Fairly straight forward. The last material function is quite a complex one, kudos to Ben Cloward for the amazing videos. This material function is used to add a procedural rain layer on top of the entire material, since Burmecia is a rainy place and I'm too lazy to do a vertex paint over everything. So the more procedural control I have the better. Here's the snippet of each material functions, but I highly recommend watching Ben's video as he goes deep into each part of the master material function.

And that's all the material setup, as you can see the materials are looking pretty heavy. My main goal wasn't making the most optimized version, that would mean I manually painted the asset textures. This setup is meant for me to plug and play any assets and instantly get the results I want with minimal texture work.

I also scattered a few megascan rubbles and decals to fill up the scene and make it look a it more interesting. Also shout out to Karim Abou Shousha for the amazing MistifyFog BP! I'm using it to add rain into the scene as seen here with the latest materials:

Next week, I'll be focusing on lighting, camera, and post process. Till then!