Parallax Occlusion Mapping different on Procedural Mesh - why?

POM material behaves different on Procedural Mesh Component and different on the exact same mesh, but converted to static mesh: https://gph.is/2R0RXlu

On the right you can see a Procedural Mesh Component, on the left the same mesh, but converted to static mesh. Notice the much stronger texture shifting on the sides of static mesh on the left.

I know that POM is best for flat surfaces, but it really surprises me that it works **better **on Procedural Mesh Component that a regular static mesh - to the point where with less height it’s totally usable with most textures even on non-flat shapes like this cylinder.

Does anyone have an idea why it behaves different? Can I make the static mesh version behave the same as its Procedural Mesh Component counterpart?

I’ve created a simple test project with these meshes + one POM material from Content Examples, with custom texture here: Box

I have noticed a bug in the past where a mesh that I converted from procmesh to staticmesh had invalid tangents. open up the mesh LOD0 build settings and try checking the recompute tangents box and see if that fixes it.

FWIW, what it should look like is that basically the POM kind of vanishes on the silhouette as it will flatten out. It shouldn’t swim around like that unless the tangents are wrong. If that still doesn’t fix it, you could try exporting to max, ‘cleaning’ the mesh (ie reset xform, maybe check the UVs) and reimporting.

Thank you, recomputing the tangents helped! So indeed, it’s an UE bug with Convert to Static Mesh of Procedural Mesh Component. I’ll try to make a bug report for that soon.

The tangents on the procmesh here were calculated by the UE CalculateTangentsForMesh() function.
What’s interesting, the default UE cylinder from the Modes panel (Engine\BasicShapes\Cylinder) also behaves like that.

The ‘Height Ratio’ param is over exaggerated here (0.1) to better show the difference, with values like 0.04 the ‘swimming’ effect is vastly reduced - and, at least for me, totally usable on meshes like the cylinder (but after the ‘Recompute Tangents’ fix).
Very nice function, I also see that there is some experiment going on in the Content Examples → ParallaxOcclusionMapping that should help with surfaces like that…

Update for others that might encounter this issue:
I’ve reported the bug, it’s available to track here: Unreal Engine Issues and Bug Tracker (UE-65798)
You can leave your vote there if you also want this to be fixed.