Unity 2022 LTS および 2023.1 の新しいウォーターシステム

ハイエンドな環境の作成には、多くの場合、海、湖、川、あるいはプールが必要になります。数個のシェーダーでこれらを再現する方法はたくさんありますが、HD レンダーパイプライン(HDRP)で、物理ベースで一貫して統合されたシステム全体を構築する作業は複雑で時間のかかるものでした。
本日は、2022.2 TECH ストリームの一環として HDRP に初めて導入された Unity の新しいウォーターシステムにスポットを当て、レンダリングに着目してご紹介します。来たる 2023.1 TECH ストリームでは、ワールドとゲームプレイとの統合を改善するために、システムの機能セットの拡張を実現します。
環境アーティストは、海、湖、川、プールなど、ボートや海辺などの他のワールドやゲームプレイの要素と統合する水面を、簡単に作成および設定できるようになりました。
最初のステップは、プロジェクトで水をアクティベートすることです。
- 各品質レベルに対する水(各品質レベルのレンダーパイプラインアセット)のアクティベートと設定を行います。
- カメラのフレーム設定で水をアクティベートします。
- Water Rendering のボリュームオーバーライドを使用してシーン内で水をアクティベートすると、カメラの位置に応じて、必要なときだけ水をレンダリングできます。
水をアクティベートした後は、数回クリックするだけで GameObject メニューで美しい水域を作ることができます。HDRP では、プール、川、海の 3 つの水面タイプを提供しています。


水域はすぐに作成できますが、ウォーターシステムには、水域をカスタマイズしてワールドやゲームプレイに統合するためのツールやオプションが多く用意されています。
活用可能なすべてのシステムと拡張子の概要については、HDRP パッケージ内の水サンプルをご覧ください(Package Manager を開く → アセットにある HDRP パッケージを選択 → Sample セクション内の水サンプルを選択)。
提供されるサンプルシーンは 4 種類あります。
プールのシーンでは、同じシーンに異なる高さの「プール」を設定する方法や、カスタムメッシュを使ってカスタムシェイプでサーフェスをレンダリングする方法を紹介しています。
海に焦点を当てた島のシーンでは、島の周りのうねりを取り除く水マスク、波を作り出す水デフォーマー、砂浜に泡を表示するデカール、波の後ろや島の周りに泡を作り出す泡ジェネレーター、ボートの中から水を排除する水エクスクルーダーなどが使用されています。また、Burst と水クエリ API を活用し、水に浮かぶ複数のオブジェクト(カモメなど)の計算を並列化することにも着目しています。
氷河のシーンでは、以下のような多くの機能が活用されています。
- 川の水域
- 滝を作る水デフォーマー
- 氷河の中に水を流す水流シミュレーション
- 川に氷山を浮かべる水クエリ API
- 氷山の後ろに泡を追加する泡ジェネレーター
- Shader Graph と水のマスターノードを使ってカスタマイズされた、川の境界線および滝の渦の泡
- 滝に落ちる水にアニメーションをつけるデカール
- 水以外の部分に投影されるサンプルコースティクス
半水面のシーンでは、カスタムパスを使った水面レベルおよび水中レンダリングのカスタマイズの使用例として、より大きなぼやけた分離の生成と、カメラレンズにかかる水の効果のシミュレーションを紹介しています。
概要をご確認いただいたところで、各システムについて詳しく見ていきましょう。
ウォーターシステムには、HDRP で最近導入されたライティングモデルに基づいて設計された、既製の物理ベースの水シェーダーが付属しています。これは Shader Graph でもカスタマイズ可能です。水面の滑らかさ、屈折、吸収、拡散、光散乱特性を調整できます。
散乱色は水の通常色と同じように機能するので、まずはそこから開始して大まかな雰囲気を作る必要があります。その後、吸収距離と屈折色を変更することで、水の透明度と、水の屈折によって見える物体に適用される色を調整できます。きれいなカリブ海の水であれば、シアン色の散乱色と屈折色、そして大きい吸収距離を設定するのが良いでしょう。一方、汚れた川の水を作るのなら、ダークブラウンの散乱色と小さい吸収距離をもつ準不透明の水にするのがおすすめです。
2022.2 における水のレンダリングには制限がありますが、そのうちのいくつかは 2023.1で対処済み(ボリューメトリッククラウドの背後にある水の表示、正確な半水面の表示)、または 2023.2 で対処される予定です(パフォーマンスの向上、水に重なる透明な表面のレンダリングへのサポート)。
もしあなたもクストー司令官のファンなのであれば、ウォーターシステムを使って水中に潜ることを楽しめるでしょう。ウォーターシステムは、カメラが水面下にあることを検知し、水の物理的特性に応じた水中レンダリングをシミュレートできます。
コースティクスを連続的に生成し、地表面に投影された表面からの光の屈折をシミュレートできます。なお、コースティクスは、例えばデカールを使って洞窟の中で反射する水のコースティクスをシミュレートするなどした場合、水中以外の場所でも投影として使用可能です。
カメラが水と空気の間に位置している場合、水面の境界線が生成され、カメラの水中部分には水中レンダリングが合成されます。2023.1 では半水面のレンダリングが改善され、カスタムパスでカスタマイズできるようになりました(半水面のサンプルシーンをご覧ください)。
水をより魅力的に見せるのは、その動きです。提供されている水のシミュレーションシステムが重点を置いているのは、水面のデフォーメーションであり、流体や水しぶきのシミュレーションではありませんのでご留意ください。
波は、高速フーリエ変換(FFT)シミュレーションを使って連続的に生成されます。簡単に言えば、周波数の異なる単純な波をたくさん合計し、複雑な波を形成するのです。周波数の範囲を調整することで、水の攪拌を操作できます。
このシステムは、バンドと呼ばれる様々な周波数の範囲を加算することで機能します。

HDRP は最大 3 つのバンドをサポートし、現実世界の水に対する 3 つの効果のシミュレーションを行い、ほとんどのユースケースをカバーしています。
- 月と遠くの風の影響によって発生する波を表す、水のうねり。これは遠隔風のパラメーターのみによって制御されていて、うねりの方向を調整可能です。
- 風が生み出す水面の乱れを表す攪拌。
- 水流やその場の風の効果を表す波紋。このバンドは周波数が最も高い、つまり波形が最も小さい帯域で、水面に細かいディテールを加えることができます。

例えば、プールは摂動が少ないので、最も周波数が高いバンドである波紋だけが使われます。川はより複雑で、波紋と撹拌のバンドが使われます。そして海を作る場合は、現実世界で見られるあらゆる波の大きさに対応できるよう、すべてのバンドが活用されます。シミュレーションは正方形のパッチで行われ、その後無限に繰り返されます。
2023.1 では、フローマップに従って波紋を生み出せる水流へのサポートが追加されます。このシミュレーションは完全に決定論的なので、マルチプレイヤーゲームや物理シミュレーション、ショートムービーやシネマティックのレコーディングにおいても一貫した結果を得ることができます。
水面のデフォーメーションをレンダリングするために、システムは頂点ディスプレイスメントを使用し、提供された連続生成ジオメトリまたは提供されたカスタムメッシュに適用することができます。プロシージャルのジオメトリは、Terrain(地形)がレンダリングで行うのと同じように、四角形を隣り合わせにインスタンス化することで機能します。これは、無限の海や長い川を作成する際、頂点密度をカメラの位置に適応させるのにも使用できます。
その上、HDRP は特別なシェーダーを使って三角形を細分化する手法である GPU テッセレーションを活用し、小さな波紋をレンダリングするために頂点密度をより細かくすることもできます。この機能により、カメラが水面から一定の範囲内にあるとき、より多くの三角形が視点の近くで生成されることがわかるでしょう。
また、ビジュアルの品質とレンダリングパフォーマンスのバランスをとるためのさまざまなオプションも用意されています。パフォーマンスの最適化については、こちらのドキュメントをご覧ください。
前述の通り、シミュレーションは効率化のためにすべて GPU 上で実行されますが、川を流れる物体を浮かべる場合などは、その一部を CPU 上でミラーリングすれば水の高さや流れをサンプリングできます。
このシミュレーションは多くの計算を必要とするため CPU コストは高くなりますが、Burst 化したジョブを使ってより効率的に並列化することで、妥当なコストに抑えることが可能になっています。
なお、スクリプト API はフィードバックに基づいて 2022.2 と 2023.1 の間で進化しているため、2 つのバージョンの間でコードの調整が必要になる可能性があります。あらかじめご注意ください。
ご利用にあたっては、水のサンプルシーンの 2 つのコードサンプルをご覧ください。1 つは島のシーンで、多数のオブジェクトのサンプリングを並列化するために Burst を活用しています。もう 1 つは氷河のシーンで、よりシンプルな非並列コードによって、流れる川に氷山を浮かせたり、カスケードを落下させたりする方法を学ぶことができます。
泡の機能を活用すると、風、岸や岩にぶつかる波、あるいは水中で動くボートやキャラクターの影響により、水上や水中で発生するあぶくを再現できます。
ウォーターシステムは、川や海の水域シミュレーションおよび遠隔風の速度に基づいて、自動的に泡を生成できます。その後、泡の量を調整し、滑らかさやテクスチャのタイリングをカスタマイズして見た目を微調整することが可能です。

Unity 2023.1では Foam Generator が追加されたことにより、ボートのトレイル、波、あるいは水域における岩の周りのホワイトウォーターをシミュレートできるようになり、生成された泡が波に乗って漂い続けることも可能になりました。サンプルシーンでは、Foam Generator のさまざまな使用例をご覧いただけます。島のシーンでは、砕ける波の頂上と島の周囲に泡を発生させるために使われ、氷河のシーンでは、川を漂う氷山の後ろに泡を発生させるために使われています。

Shader Graph を使用すると、水のマスターノードにカスタムの泡を注入し、川の境界線や滝の渦などにカスタムプロシージャルの泡を追加できます。例として、氷河のサンプルでは、滝の下の渦は Shader Graph でカスタムの泡テクスチャをスクロールしてブレンドするだけで作られています。境界線上の泡は、深度バッファをおおよその深度でサンプリングして作られています。

波の攪拌がある場所にはシミュレートされた泡が注入されます。希望のビジュアルを生み出すために、ワールドの一部に泡が生成されないようにするには、泡マスクを使用してマスクアウトしてください。
水面やシミュレーションをよりリアルに見せるには、ワールドや小道具とよりなじませるために局所的な修正を行う必要があります。例えば、ボートの中から水のジオメトリを取り除いたり、うねりにさらされた海岸に砕波を加えたり、岩の周りに泡を発生させたり、水流を局地的に変えたり、湾の中に穏やかな場所を作ったり、川の途中で滝を作ったり、川の中に小さな渦を発生させたり、海の中央に巨大な渦を発生させたりすることなどです。
複数のコンポーネントを活用すれば、シミュレーション、泡、水流をカスタマイズして、これらの局所的な変化や、より複雑な効果を作り出すことができます。
- 水マスクは、水面の特定部分の波紋、うねり、泡を減らしたり、抑制したりすることができます。
- デカールを水に追加すると、局所的に泡を追加したり、水の滑らかさをオーバーライドしたり、法線マップを使用した小規模の局所的なデフォーメーション(水滴、衝撃、カスタムの波紋など)をシミュレートしたりできます。また、ウォーターシステムとは別に、濡れた砂や岩(島のサンプルシーンを参照)や壁のコースティクス(氷河のサンプルシーンを参照)のシミュレーションを行うのにも使えます。なお、デカールはグレースケールとしてのみ扱われ、色の変更はできませんのでご注意ください。
- 水デフォーマーは、島のサンプルに登場するような波や、氷河のサンプルのような滝を作成するために、シミュレーションを局所的に修正できます。
ほとんどの機能がさまざまなコンソールで作動する、氷河のシーンのパフォーマンスを測定し、これに基づいてウォーターシステムのプロファイリングを行いました。測定の結果、水のレンダリングにかかる時間は、旧世代機では約 7 ミリ秒であったのに対し、最新世代の GPU では約 4 ミリ秒でした。もちろん、これは水の品質設定、シミュレーションの複雑さ、そして画面に表示される水のピクセル量に大きく依存します。しかし、このシステムはさまざまなプラットフォームで滑らかに動作するのに十分なパフォーマンスを誇っています。
さらに、このシステムは、シェーディングを最適化して多数のライトソースをサポートするために、ディファードクラスターライティングを採用しています。遠くの波でもきれいに表示させるために必要な頂点の数が重要であるため、レンダリング時間の大半は GBuffer パスによるものです。水面で GPU テッセレーションを有効にする場合、このコストは、カメラが水面から離れているときの最大テッセレーションレベルやフェード距離を変更することで制御できます。
各水面の Miscellaneous セクションでは、水流の方向、デフォーメーション、泡、その他水面に適用されるマスクを視覚化するための様々なデバッグモードにアクセスできます。

ウォーターシステムがより複雑なシーンでどのように動作するのか確認するために、プール、島、川のシーンを紹介するデモプロジェクトを作成しました。

島のシーンでは、無限に広がる海と砂浜に打ち寄せる波が表現されています。水マスクの使い方や、カスタムレンダーテクスチャを使ったデフォーマーや泡ジェネレーターの作り方が紹介されています。また、デカールを活用することで、波が砂浜に近づいたときの水面との複雑な相互作用を生み出しています。
プールのシーンでは、リアルな色、深度、水中表現、コースティクスを伴う、室内の水面が表現されています。

川のシーンでは、インスタンス化されたクアッドが使われ、流れのシミュレーションを行うための水流マップ、ビジュアルをより良くするためのデカール、カスタムシェーダーグラフ、VFX グラフが活用されています。
これらのデモは、GitHub でダウンロードできます。
ウォーターシステムを使用した作業には、HDRP および Unity 2022.2 以降のバージョンが必要です。
2022.2 でも初期機能の一部は使用できますが、API の変更を含む複数の改善と機能が追加された 2023.1 から利用されることをお勧めします。
Package Manager から水のサンプルをダウンロードしてください。ここから、サンプルコードやシステムを再利用していただけます。また、GitHub 上の WaterScenes のデモプロジェクトでは、ウォーターシステムを統合したより複雑な例をご覧いただけます。
もっと詳しく知りたい方は、Rémi と Adrien による GDC 2023 で行われた詳細解説をご覧になるか、Unity によるドキュメントをお読みください。
現段階では新機能の計画はまだなく、現在は安定性の確立に集中しています。フィードバックやご質問は、専用の Unity フォーラムのスレッドで受け付けています。
新機能の提案や検討中の機能への投票は、公開ロードマップで行うことができます。
HDRP フォーラムで、ウォーターシステムへのフィードバックをぜひお寄せください。現在連載中の Tech from the Trenches シリーズで、Unity 開発者による今後の技術解説もぜひ引き続きチェックしてください。
