Faking Glass/Liquid on Surface?

My goal is to create a node setup that mimics droplets or layered areas of clear liquid on a surface. This could be driven procedurally or via image mask.

Creating a shift between the glossiness of the base material and that of the liquid is easily done. Similarly, the physical thickness of the liquid layer can be faked via displacement. If the liquid is opaque that is all that is necessary, but if it is mostly transparent this is where problems appear. The liquid should refract and distort the material underneath. I suspect there should be a way to mess with the normals somehow, so that the underlying details are distorted the way they would be with a droplet over them. Ideally, the edge droplets would also show the background through them, but that might be too hard to fake.

This thread on procedural frost uses some of the same techniques I’m trying but it’s set up to work with clear droplets on a frosty glass, not an opaque material.

Attached is an image of what I’m working on currently. In this case everything is driven by a voronoi procedural to create the droplet displacement and control the glossy reflections. The front-facing droplets look reasonably good, especially with the slight cloudiness I’ve faked with a color-mix. I’m attempting to fake some refraction by applying a negative bump to the diffuse “substrate” proportional to the actual displacement, but it doesn’t seem quite correct.

Nodes to follow when I clean them up enough to be legible. Any input on normal-faking wizardry appreciated.


Nodes for the above material. Mostly stock nodes; FresnelShader is a semi-PBR reflection overlay and MapRange takes an input in the (definable) range A->B and maps it to the (definable) range C>D, useful for procedurals that go 0-1 but you want the output to be between .25 and .4, eg.