油膜の色の物理的基盤は虹色であり、ニュートンのリングにも関連しています。具体的には、油層の厚さは光の波長のオーダーです。光はオイルの上面と底面の両方から反射するため、特定の波長で、ある角度では2つの反射の位相がずれ、互いに相殺されます。他の角度では、反射は同相になり、加算されます。これは波長ごとに異なる角度で発生するため、白色光でオイルを照らすとすべての色が生成されます。単一の周波数(レーザー光など)で照明した場合、一連の明るいリングと暗いリングのみが表示されます。
油層の屈折を無視して、状況のジオメトリを計算するだけで、特定の波長の反射光の明るさが次のように変化することがわかります。
sin(2.0 * pi * oilThickness / (dot(L, H) * wavelength)) * 0.5 + 0.5
理論的には、これはすべての波長にわたって統合する必要がありますが、実際には、おそらく赤、緑、青に対してそれぞれ行うことができます-たとえば、それぞれ700、550、400 nmとします。油の厚さを変更すると、色の輪の見かけの半径が変わります。おそらく2.0 * pi * oilThickness / wavelength
、シェーダーに均一な値として提供される単一のRGB値にラップします。必要に応じて、さまざまな厚さの油をシミュレートするためにテクスチャを掛けることができます。これがおそらく、上の画像で興味深いテクスチャのほとんどを与えるものです。
これにより、BRDFに乗算できるRGBカラー値が生成されます。このdot(L, H)
係数はポイント/指向性ライトに使用されdot(N, V)
、環境マップの反射にもこれを適用する代わりに使用できます。
免責事項:シェーダーでこれを試していないが、いくつかの図を描いて「うまくいくはずだ」と自分に納得させた...それで試してみたら結果をお知らせください!:)