I was playing with this issue with the following approaches for OpenLand. Here are some of the methods I tried:
- Distance-based specular modifications
- Camera vector (fresnel) based specular modifications
- Camera vector (fresnel) based normal modifications (as suggested by @witch-dev
But all these need some input from the user & it still looks bad in some cases.
Recently, I tried specular = 1-roughness
method & it really works well for my use cases. Here’s bit more about it: