油性/汚染水をレンダリングしていますか?


19

そこにあるシェーダーウィザードには、これに似た油性/汚染された水の効果を実現する方法のアイデアがあります。

油水

理想的には、水は均一に油性ではなく、代わりに油が何らかのソース(化学プラントからの汚染排水など)から生成され、水域全体に拡散する可能性があります。この部分の私の考えは、「オイルマップ」を水面上の各ポイントでオイルの密度を決定する2Dテクスチャとして保持することです。拡散し、その速度で水の速度とともに自然に移動します(動的波の波動粒子シミュレーションがあり、水面の泡についても同様のことを既に行っています)。ただし、オイルが水と同じ速度で移動しない可能性があるため、物理的にどの程度正しいかはわかりません。

そして、私はそれらのすべての奇抜な色を作る方法がわかりません:-)。考え?


テクスチャを使用する..?
色彩の

@bobobobo-それを見る方向は、どの色が表示されるかに影響しますが... youtube.com/watch?v=NRtUoMG16ZU
ロバートフレイザー

1
en.wikipedia.org/wiki/Thin-film_interferenceに基づいたシェーダーを適用することをお勧めしますが、シェーダーを作成する方法はわかりません。
jzx

2
gamedev.net/page/resources/_/technical/…)トピックがわからないため、答えに
留まら

回答:


25

油膜の色の物理的基盤は虹色であり、ニュートンのリングにも関連しています。具体的には、油層の厚さは光の波長のオーダーです。光はオイルの上面と底面の両方から反射するため、特定の波長で、ある角度では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)、環境マップの反射にもこれを適用する代わりに使用できます。

免責事項:シェーダーでこれを試していないが、いくつかの図を描いて「うまくいくはずだ」と自分に納得させた...それで試してみたら結果をお知らせください!:)


クール。上部と下部の油面に反射があるのは、一部の波は上部で反射し、他の波は屈折しているためです。これらの屈折波はボタン表面に進み、そこで再び屈折または反射することができます。
dsilva.vinicius
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.