This is most likely due to the way POM works. At more and more glancing angles, you can see the steps for each ray. It’s just a limitation of the technique. The way to get around this is to increase the number of steps, but there will always be an upper limit.
You can try to increase the number of steps POM uses as the camera is at a more glancing angle (Camera Vector Dot Normal), so you don’t pay that cost when looking down from the top. For something as large as a road, you probably also want the steps to fade off to nothing after a certain distance from the camera.
Okay first, apparently putting displacement map in normal map blue channel and setting heightmap channel to 0,0,1,0 doesn’t give good results (lots of noise close up). Looked butter smooth with a separate heightmap texture sampler though, but having a separate heightmap texture sampler per material is quite a waste of memory and nerve.
Second, the stretching issue seems to happen when the mesh is scaled non-uniformly, in this case, road material is 4096x2048, road mesh was also scaled from 1x1x1 to 2x1x1 which caused the UV to be stretched along the X and the height going in all the wrong directions when viewed from the sides. This issue makes it quite difficult to get perfect results with landscape splines even if the mesh is modeled 2x1x1 and UVed properly, because landscape spline by itself makes the spline mesh shorter, longer, depending on the distance pf control points from each other.
Third, I find the results quite unacceptable with 32 and 8 steps, and going much higher than that isn’t a very good move in UE4 so I give up using it. I’m going to setup distance based tessellation for roads. A little deformation helps them blend better to the ground anyway.
Normal Maps in UE4 use BC5 compression, which means that Blue channel is for all intents and purposes useless and nuked out. You can’t use it for anything really. Using a separate Heightmap is the way to go. You’re not really saving any memory because BC5 just uses extra bits for the R and G channels anyway.
For best results, TC_Grayscale or TC_DisplacementMap is best for Heightmaps since they’re purpose built for Heightmaps. Texture Compression really matters in UE4. It’s very commonly overlooked.
Hmmm not quite, I use Masks compression when I store heightmaps in normal map blue channel. The blue channel for normal map is reconstructed through shader and the heightmap is used for landscape tessellation, but for POM looks too noisy for some reason even though I blur the heightmap a lot.
Probably not with BC3. Good enough for heightblend but, pom or tess does look blocky. Might be worth trying BC7.
You are not restricted to that in any way.
Hmm strange. I don’t recall seeing POM issues of that severity caused UV stretching. Well, atleast not within reasonable margins. Haven’t ran it on splinemeshes before though.
I still kinda think that the issue on your first screenshot is caused by excessive view angle coupled with reference plane setting.
32 steps seems more than enough for the use case you are up to. 8 shadow steps might be a bit low.
One particular issue with Tess for roads is the fact that you will be paying base cost for all verices of the road, not just the ones needeing tess, the same like landscape.
With Mask compression blue channel isn’t independent so normal map r and g will cause cross talk errors to blue channel. So noisy normals is cause of noisy height map. For performance it’s better to use single channel format for textures that are sampled multiple times per pixel.(POM). For similar or better quality with better performance you can use lower size texture but higher quality compression.(alpha aka BC4)