It's a simple logic . Normal map represents a pixel normal , a vector (direction) each pixel is facing in comparison to vertex normals (tangent one). So if you see it wrong there is only a few possibilities: a. the direction is wrongly recorded to the texture . Green inverted maybe or color representing standard is wrong…
Make the bevel at the width where it will be at least a pixel wide for most of the time it's being viewed. Or, two pixels wide if you think it's not too comically wide up close.
One pixel hard and soft brush. Three pixel hard and soft brush. Master the brush options(opacity,tipshape,texture and scattering). I need nothing else.
Jocose: those squares in the rotor blades are 2x2 pixels, with a 1 pixel space in between. Hexagons aren't really possible due to technical limitations.
You probably want to get the difference of the values pixel-by-pixel using ddx, I think. Off the top of my head... for CG/HLSL; float heightmap = your height map value; float3 normal; normal.x = ddx(heightmap); normal.y = ddy(heightmap); normal.z = sqrt(1 - normal.x*normal.x - normal.y * normal.y); // Reconstruct z…