【Unity】カスタムパスでメッシュの厚さを計算して屈折マテリアルで使う

投稿者: | 2024-02-05

参考:https://github.com/alelievr/HDRP-Custom-Passes?tab=readme-ov-file#glass

参考プロジェクトの「Glass」シーンでは、カスタムパスでメッシュの厚さの近似値を計算して、透明マテリアルで使っています。詳細に見てみました。

カスタムパスでは、表面と裏面の深度の差によって厚さを計算します。それをカスタムカラーバッファに書き込みます。

Custom Pass Volume

Custom Pass Volumeコンポーネントには、DrawRenderersCustomPassがあります。

カスタムカラーバッファに書き込みます。DepthはNoneになっています。マテリアルにはシェーダーグラフが設定されています。

シェーダーグラフ

シェーダーグラフで深度の差を描画します。

Screen Positionノード(Raw)のwの値を使っています。これはカメラ空間の深度です。

Is Front Faceノードを使って、表か裏かを判別します。表のときは深度をマイナスにしています。アルファは1です。

Graph Inspectorを表示してみます。

Surface Typeが「Transparent」になっています。

Blending Modeは「Additive」が選択されています。なので、表面と裏面の差が、カスタムカラーバッファに描画されます。裏から表を引いた値が厚さになります。

ガラスのマテリアル

ガラスのゲームオブジェクトのマテリアルにはシェーダーグラフが設定されています。

Graph Inspectorでは、Surface Typeが「Transparent」で、Refraction Modeが設定されています。

シェーダーグラフでは、カスタムカラーバッファの値がマスタースタックのThicknessに入力されています。

これでメッシュの厚さが適用されます。

Injection Point

カスタムカラーバッファの色をカメラに描画するカスタムパスを追加してみました。

Injection Pointが「Before Transparent」だと、さらに上からガラスが描画されます。

Injection Pointを「Before Post Process」や「After Post Process」にすると、Thicknessの白黒の値が画面に表示されます。

参考:
https://github.com/alelievr/HDRP-Custom-Passes?tab=readme-ov-file#glass
https://forum.unity.com/threads/what-is-screenpos-w.616003/

コメントを残す

メールアドレスが公開されることはありません。