How to reduce normal map baking artifacts caused by low/high poly mismatch?

I’m using a Blender + Substance Painter pipeline (baking and texturing) with a low-to-high workflow: first a low-poly model, then geometry refinement, bevels, and subdivision. Since I’ve only just started learning, I ran into a problem on the simplest possible model: a cylinder. I made a basic 20-sided cylinder (0.6 m in diameter) and a high-poly version of it by adding bevels and subdivision.

When I try to bake the normal map, I get artifacts caused by a mismatch between the high-poly and low-poly models. Because the meshes diverge, the angles smooth out worse than they could.

Even though this only shows up on glossy surfaces, which I’m not planning to use, I’d still like to understand what approaches exist for solving this kind of problem and how closer mesh correspondence can be achieved. I don’t want to go with an “eh, good enough” approach, even if nobody but me will ever notice.

I found an example of what I’m aiming for: CurvedElements_NM_Test - Download Free 3D model by Fabi_G (@plasmaernst) [f2bdc22] - Sketchfab

But I can’t get any further than LP 01 RESD. I don’t understand what repurposed normals and matching curvature mean. Any result starting from 02 would be fine for me, but ideally I’d want something like LP 02 REMC RPNM. Or am I doing something fundamentally wrong? (The tutorials I watched did not cover cases like this.)

P.S. I hope mentioning Substance Painter doesn’t make this post off-topic. I’d rather not cross-post if I can get answers here.

Welcome!

The example you posted is mismatched, it’s just that the high poly model that was used for it has a bevel that’s wide enough to absorb this mismatch. The low-poly cylinder would be scaled down a bit so no parts of it poke out of the high-poly and the high-poly cylinder would have a bevel wide enough to be well visible in the bake.

I partially solved the issue using custom geonode which scales high poly version up a bit after subdivision so that the outline of the smoothed version now matches the low-poly outline as closely as possible (and artifacts gone). The rest is just a limitation of normal map that can’t alter the silhouette.

One more thing I could do (I just don’t know how) is to use low-poly for bevels on the top side (and adjacent edges), while using high poly for sides.

Something else that can be done if the situation allows it is to purposefully make the high poly mesh a bit angular to match the shape of the low-poly. This can be hard to apply to a cylinder though, as the effect would need to be erased from the rounded sides.