Working with 2.9 and Cycles, I have created a wet asphalt road. In order to create water puddles on this asphalt, I have duplicated the road object and given it a water material. Then I played with the Z axis in order to achieve the desired size of puddles. However, a close look at a high resolution image shows that the puddles’ edges are straight sharp lines and not blurred or unclear as a realistic puddle's edges should look. Please see the enclosed image. All the shaders and the tweakings that I have tried, unfortunately proved unsuccessful. Also, I did not find any similar question in that subject. What should I do in order to get a “real” puddle with “real” edges, which are not straight and sharp edges? Thank you for your kind advice.
While most people would recommend a pure shader solution, I'll answer for the case where you want a separate object.
Assuming that your road is a mostly flat plane using a shader to provide fine details, the issue here is that by default Blender converts shader displacement output to a bump map. Bump maps are effectively an trick of the light and will therefore show themselves as flat when viewed at extreme angles or compared with real geometry. To switch to real displacement, go to your object's 'Material Properties'->'Settings'->'Surface' and select 'Displacement Only' or 'Displacement and Bump' in the combo-box.
Now, since this is real displacement, you'll need the corresponding geometry to go with it. One way is to subdivide the geometry either manually or with a modifier until you get to the level of precision you desire. While this works, it requires judgement as to the appropriate level of subdivision.
If you are willing to use the experimental feature set, you can use micropolygon displacement to adaptively subdivide the geometry. To do this, you can go to 'Render Properties' and set 'Feature Set' to 'Experimental', then add a 'Subdivision Surface' modifier with 'Adaptive Subdivision' checked.
Caveat: the displacement does not influence physics simulations. For that, you will want to use the 'Displace' modifier which only accepts textures.