WebGLとリキッドガラスの融合

ウェブ上のリキッドガラス効果の多くは、DOMのクローンを使用しています。HTML要素をコピーし、それらを歪ませ、ぼかしを加え、ガラスレイヤーの下に配置するという手法です。

この手法はWebGLでは機能しません。DOMのクローンは、ライブキャンバスからピクセルをコピーすることができないからです。キャンバスは、フレームごとに変化するフレームバッファです。

キャンバス上でリキッドガラスを実現するには、2つの選択肢があります。1つは、毎フレームキャンバスをキャプチャする方法ですが、これはコスト(負荷)がかかります。もう1つは、ガラス効果そのものをWebGLパイプライン内に組み込む方法です。

私は2番目のアプローチをテストするために、実験的なプロジェクトを構築しました。効果を示すには動きのある背景が必要だったため、Konmariによるインタラクティブな水面の波紋デモからインスピレーションを得ました。

リアルな波紋の物理演算と、浮かんでいる花を取り入れた独自のバージョンを作成しました。

その結果、リキッドガラスのパネルを備えたWebGLの水景シーンが完成しました。このパネルは、その下にあるライブキャンバスを屈折させます。

仕組み:

  • 水面にはハイトフィールド(高さフィールド)による波紋シミュレーションを使用しています。
  • ポインターの動きによってグリッド上に波が発生します。
  • WebGLシェーダーが、それらの波を光と歪みに変換します。
  • 2Dキャンバス上の花が、屈折をより鮮明に見せる役割を果たしています。

ガラスパネルはDOMをクローンするのではなく、ピクセルをサンプリングします。

レンダリングフローは以下のステップに従います:

  • WebGLの水面をレンダリングする。
  • 2Dの花をレンダリングする。
  • 両方を結合して、1つの隠しソースキャンバスを作成する。
  • ガラスシェーダーを使用して、そのソースキャンバスをサンプリングする。

シェーダーはソフトエッジの法線(normal)を推定します。これを利用してソーステクスチャを曲げます。また、素材に厚みを感じさせるために、ティント(色付け)と色収差(chromatic split)を追加しました。

目標は完璧な物理演算ではありません。動いているシーンの上に置かれた、本物の素材のようにパネルを感じさせることです。

これが機能するのは、シーンがすでにピクセルとして存在しているからです。ウェブ全体に対する完全なソリューションを作るのはより困難です。実際のウェブサイトでは、テキスト、ビデオ、スクロールが使用されているからです。

私はこの分野を注視しています。将来的なソリューションにとって、パフォーマンスが最大の課題となるでしょう。

Demo: https://ripple.carsonye.com/ Repo: https://github.com/Whynotmetoo/water-ripples

Source: https://dev.to/_carson_ye_/where-webgl-meets-liquid-glass-401l