Spotlight - Project Geneva #02 - [Details]

Making Of / 22 February 2020

Hey everyone, it's time again for another blogpost! As I already kinda spoiled on Twitter yesterday, this will be another 'Spotlight'. My job and Final Fantasy 14 just took up way to much of my time ... especially FF14. :D Also please note that all I'm gonna show you now is pretty early WIP, polishing will come ... well I don't know when. xD


Today I'm going to show you the Mesh-Decal-Normal-Trimsheet workflow I'm using in this project. I'll cover all aspects and some neat little 'Tips & Tricks' I discovered along the way. Here is a short list of stuff I'm going to cover:

  • Alpha & Hardsurface generation in Substance Designer
  • Alpha & Normal baking in 3ds Max
  • Trimsheet creation in Substance Painter
  • Mapping the meshes on the trimsheet
  • Material Set-Up & usage in UE4

Along the way I'm gonna show screenshots of each process and explain how I made it work for my specific use case. I'm glad you are following along, let's hop straight into this!

Generating all the ressources

I started with creating a bunch of simple (or medium complex) shapes inside Substance Designer. I chose SD because I'm pretty familiar with it and can generate every map needed (For my case mostly Normal and Opacity) directly out of the shapes created. 'Procedural Texturing' FTW! \o/ 

You could basically do the whole process in Photoshop as well though, just pick whatever software you are most comfortable with. I kinda went a bit overboard with creating alphas & normals and it quickly got out of hand ... as you can see in the screenshot below.

Here are the ones I'm actually planning to use in the project. As you can see, i trimmed the trims (pun intended :3).

At this time I took a small break, searched up some references and analysed them ... to be honest ... I should have done that from the  start. I built a bunch of useless shapes - or shapes which didn't work well in general - and wasted a lot of time. Well stuff like this happens, it's always a back and forth. This was also the point when I decided to model and bake the 'more complex' shapes in 3ds Max and then bake them down to a plane.

The neat thing about this method is, that you can go really crazy, as long as you keep a couple of things in mind. The most important thing is -  Normalmaps need slopes, bevels and gradients to work properly! Don't ever model in perfectly straight 90° angles ... you won't get the results you are looking for. Also you can go ham with the polycount, since you are basically building highpoly models ... so just go for it!

Assembling the trimsheet

Ideally you would want all of the single trims ready by this point, but your mind on which to use can change pretty quickly (trust me I've been there). So I started assembling while still baking and generating even more shapes. To be flexible and adaptable to changes was also one of the reasons I decided to assemble the trimsheet in Substance Painter. It gave me great control over where which trim should be placed and I didn't have to worry about any extra work, since I just placed normal and opacity maps at the same time.

The 3D viewport was pretty handy as well. I could just check the results directly in a realtime environment, which made adjustments easy and errors - or suboptimal stuff - pretty obvious. To aid me with placing all the single trims I quickly built a grid texture in SD. I know that my placement with this grid is not the best solution, but it would guarantee me an even distribution and fast iteration opportunities.

I could easily erase and swap out different trims without having to worry about them fitting in or overlapping with others ... it's just a convenience thing. The grid also helps me to create a 'cheatsheet' afterwards. Here I can see which plane in my engine will be what decal.

Mapping geometry to the trimsheet

This task can vary from simple to annoyingly tricky. First I loaded the trimsheets opacity and normal into 3ds Max and mapped them to a 2x2m plane. Since I worked on a grid inside SP I could just subdivide the plane to perfectly match my grid. This enabled me to simply cut out each individual trim and clean them up. This task would have been way more time consuming if I hadn't been working grid orientated.

The planes you see above are mostly for quick testing uses inside UE4. With them I can try what works well and can break up the modularity of certain parts by adding them on top of the actual mesh in the engine. Most of them will be added to the final meshes before I export them to UE4 though. 

Those planes alone are a great start to get some details going, but my choices of what to place where (especially where) still were limited. So I decided to add some 'custom' mesh decals into the mix. What do I mean by that? It's simple ... I wrapped some planes around certain parts of already existing meshes and mapped them onto the trimsheet as well. And voila ... I'm now having mesh decals which wrap around corners and fit perfectly onto certain parts of my level geometry. 

This method can't only be used on the tiling trims at the bottom of my sheet, you just need to get creative with UVs and topology. On the next screenshot you can see the same trim being mapped to different geometries. To not stretch the corners of the trim I simply used some support loops ... those work almost the same as traditional support edges in highpoly modelling. You just gotta cheat your way through! :D

But keep in mind to not overextend the use of this, figure out the limits! If you squash 4m of geometry onto something like 20 pixels ... well you know what happens then. 'RIP TexelDensity'

Setting up the material in UE4 and finally using them

It's finally time to see the fruits of our labour! :D (But not without some more work to be done first.)

UE4 has some neat features regarding decals and blending of them. This methods only works (as far as I know) when you enable deferred decal rendering in your project settings. Let's have a look at some of the materials features and how I set it up:

  • Blending only the normal pass over the other maps
  • Setting intensity of the normal details
  • Inverting the normal details
  • Automatically adjusting the normal intensity based on the distance from the player camera
  • Ability to swap normal & opacity maps

So now, let's have a look at the material and the instance. It surprised me, but it's rather small.

I had to implement the 'distance-normal-intensity-adjustment-thingy' cause my decals tended to completely fade out once you were a couple of meters away from them and I didn't find any settings to fix that ... so I just built it directly into the material. If it works ... it's good enough! :D

And finally ... here are some screenshots of actual used trim decals inside UE4. Took me long enough to get to this part in the post. :D

What's next?

Well ... that's easy ... generating, baking and placing more of them! Yay ... someone has any good Netflix recommendations for me? :D

Also I hope you liked this short breakdown and got some insights into how I achieved the results you saw and will be seeing in the future. If you have any questions - as always - don't hesitate to ask! I'll try to provide answers and help where I can.

Thanks for sticking through this, feedback is always appreciated!

Cheers and have a great day / evening / night :D