Per vertex lighting and normal maps

Hi everyone,

I’m experimenting with a deliberately retro / 5th-generation-inspired visual style.

My goal is to use very simple meshes (low poly) combined with detailed normal maps, but without using standard per-pixel dynamic lighting.

Specifically, I’m interested in using per-vertex lighting (Gouraud-style) as the main lighting model, while still having normal maps influence the final shading in a non-physical way (for example, modulating or perturbing the interpolated vertex lighting, rather than doing full per-pixel lighting).

I understand that “true” normal mapping normally requires per-pixel lighting, so I’m not aiming for physically correct results. This is more of a stylized / hybrid approach.

My question is:
Is it possible in Unreal Engine (via materials or custom shaders) to combine per-vertex lighting with normal maps used as a secondary modulation, instead of standard per-pixel lighting?

If so, what would be the recommended approach (Unlit materials, custom vertex calculations, etc.)?

No. The engine builds the final image per pixel by sticking all the layers.

What you can do is fake it by altering each layer to taste.

But its better if you pick an engine that isn’t deadlocked and do it the right way.

Also a .usf isn’t going to do much as the geometry cache you need to access to read per vertex things is not readily accessible ot editable like you would expect it to. You can still get around it, but again, better options out there…

normal mapping is always per pixel. you cannot do it per vertex. how do you imagine that to work?

if you wanna do it per vertex you’d have to use the forward renderer and write custom shaders to basicly in the vertex shader compute emboss bumpmapping offsets for the (mobile spec) 5 possible lights per object and in the pixel shader you combine each emboss map with the individual light colors and modulate the whole rgb thing. you have 8 4d vectors inbetween the shader stages. so you should pack the data. 5 rgb triplets and 5 2d vector sets. you also should use bc4 greyscale compression to lower the memory bandwidth, cause you’ll have to randomly sample the emboss map 6 times at different locations, to compute the embossing of 5 lights.

regular normal mapping is cheaper, tbh. one sample and a dot product and some color modulation to get a better result.