How to calculate substrate IOR when using Principled topcoat?

How to calculate this correctly? Real world example; a bumpy shiny plastic is lowered into water, and its specular reflections are weakened significantly. So IOR 1.5/IOR 1.333 = IOR 1.125. Looks about right.

But what if the coating has a higher IOR? Say IOR 1.5/IOR 1.75 = IOR 0.771 which takes us into Snell’s Window territory for the substrate and it just looks weird.

Do I do the calculation correctly, or should I always use the lower IOR value as the denominator to always ensure a substrate IOR > 1?

The IOR of the materials does not change,unless you have a chemical mixture.
What you can calc is the reflection amount like this.


For a approximate chemical mixture you can calc this way

Thanks. Those numbers give me 0.0059 though, not 0.0069? Formula used: =POWER((A1-B1)/(A1+B1);2)
Regardless, flip instead of allowing going into <1 IOR.
So 1.5/1 and 1/1.5 both give 0.04.
1.5/1.3333 and 1.3333/1.5 both give 0.0035, or 8.6% of 0.04? Damn, that’s a lot. Sounds like it should be possible to calculate a new IOR based on calculated F0 reflectivity though? Regardless, this wasn’t about accuracy, just some intuitive way of reducing the reflectivity of the substrate layer, where my IOR < 1 just looked plain wrong.

yeah,i calculated the same 0.0059
however,the formular for F0 seems to be correct.

Yes,you can get a IOR from the F0 value.This calculation is based on material in air.

If you know the outside IOR and F0 you can try this one (have not checked myself,should be give the same result as in first formular with the IORs set in)

In this formular the IOR-Outside IOR is switched vs the first formular
have to check some reference papers

It should be ((n1-n2)/(n1+n2))² = F0
n1 is outside like air = 1
n2 is the substrate like plastic =1.5

For your example with IOR 1.5 and outside coating IOR 1.75

The squareroot of F0 = 0.076923


Seems to be right,you can calc with a known F0 and outside IOR the IOR of the substrate

The idea was to figure out a new base IOR based on the topcoat IOR. Turns out, verifying with geometry nodes to be able to read the numbers directly, I can just do maximum/minimum. This ensures result > 1, and provides the same result as if I were to do the whole calculation chain. I was on the right track, just forgot the min/max thing.