浮油颜色的物理基础是虹彩,并且还与牛顿环有关。具体地,油层的厚度约为光的波长。由于光在任何给定波长下都从油的顶面和底面反射,因此在某些角度上两次反射将异相并相互抵消。在其他角度,反射将同相并加在一起。对于每种波长,这都以不同的角度发生,因此用白光照射油会产生所有这些颜色。如果以单个频率(例如激光)照亮,则只会看到一系列明暗环。
如果您忽略了油层中的折射,只是弄清楚了情况的几何形状,您会发现对于任何给定波长,反射光的亮度都应像
sin(2.0 * pi * oilThickness / (dot(L, H) * wavelength)) * 0.5 + 0.5
从理论上讲,应该在所有波长上进行积分,但实际上,您可以只对红色,绿色和蓝色进行操作-分别说700、550和400 nm。改变油的厚度将改变彩色环的表观半径。我可能会将其包装2.0 * pi * oilThickness / wavelength
为提供给着色器的单个RGB值,作为统一值。如果需要,您可以将其乘以纹理以模拟不同厚度的油-这可能就是上面图像中提供大多数有趣纹理的原因。
这将产生RGB颜色值,您可以将其乘以BRDF。该dot(L, H)
因子将用于点/定向光,您也可以dot(N, V)
在其中替代以将其应用于环境贴图反射。
免责声明:我没有在着色器中尝试过此操作,只是绘制了一些图表并说服自己“应该工作” ...因此,如果您尝试尝试,请告诉我结果!:)