3DGS が単層水マテリアルに遮られる問題を解決する
Single Layer Water Support
概要
Unreal Engine の Single Layer Water(単層水) は深度バッファを使って屈折、コースティクス、水中のフォグを実現する。その中核となる依存はシーンの深度である。有効な深度が書き込まれたピクセルだけが水面の屈折と吸収の計算に参加できる。
なぜ個別の対応が必要か
プラグインは View Extension の仕組みで 3DGS をレンダリングして深度を書き込み、そのタイミングは BasePass の後になる。一方、単層水は既定の流れでは BasePass の前に深度バッファのコピーを取り、その後の合成に使う。この時点では 3DGS はまだレンダリングされていないため、コピーには当然その深度が入っていない。
| 設定 | 深度バッファのコピーのタイミング | コピーに 3DGS が含まれるか |
|---|---|---|
| 既定(オフ) | BasePass の前 | 含まれない |
SingleLayerWater Support をオン | BasePass の後 | 含まれる |
既定の流れ 対応を有効にした後
深度バッファをコピー ← 3DGS なし BasePass
│ │
▼ ▼
BasePass 3DGS が深度を書き込む
│ │
▼ ▼
3DGS が深度を書き込む 深度バッファをコピー ← 3DGS を含む
│ │
▼ ▼
単層水の合成 ← 3DGS を読めない 単層水の合成 ← 3DGS を正しく読める
コピーに 3DGS の深度がない場合、水面が屈折と吸収の計算をするときに読み取るのは 3DGS の背後のシーンになる。その結果、水中の 3DGS が屈折に参加せず、水面と 3DGS のオクルージョンの判定も誤る。
SingleLayerWater Support を有効にすると、プラグインは r.Water.SingleLayer.DepthPrepass によってコピーのタイミングを BasePass の後に遅らせる。この時点では 3DGS の深度が書き込まれているため、水面が正しく処理できる。
SingleLayerWater Support を有効にしていないときの結果:

単層水対応を有効にしていないときのレンダリング結果
使用上の代償
- 有効にするとモデルの影にある程度のジャギーが出る。

単層水対応を有効にすると出ることがある影のジャギー
使用手順
1. 設定を有効にする
エディターの LCC4Unreal パネルで設定ボタンをクリックし、プロジェクト設定のプラグイン設定画面を開いて SingleLayerWater Support をチェックする。エンジンを再起動すると反映される。

プロジェクト設定で SingleLayerWater Support を有効にする
2. 単層水のマテリアルを作成する
- 新しいマテリアルを作成し、
Shading ModelをSingle Layer Waterに設定する - 水面のカラー、吸収係数、散乱などのパラメーターを設定する
- 水面の Mesh または
WaterBodyCustomに適用する
3. 水面を配置する
水面の Actor を LCC2 シーンの適切な位置に配置する。水面の高さによって、どの 3DGS のピクセルが水中になるかが決まる。
4. 結果を確認する
LCC2 シーンが正常に読み込まれてレンダリングされた後:

単層水対応を有効にした後の正しいレンダリング結果
注意事項
- この設定項目はグローバル設定で、プロジェクト内のすべての単層水マテリアルに影響する
- 変更後はエンジンの再起動が必要である(CVar が ReadOnly で、Shader Key に影響するため)
- 引き換えに水面のピクセルは Virtual Shadow Map の影の品質を一部失う
- プロジェクトで単層水を使わない場合は、既定のオフのままにしておく