【Unity】オブジェクトIDを使って輪郭抽出する

投稿者: | 2024-01-18

ObjectIDCustomPassとシェーダーグラフを使って、輪郭抽出してみました。

オブジェクトIDカスタムパス

カスタムパスに「ObjectIDCustomPass」を追加します。オブジェクトごとに色分けできます。

カラーバッファのターゲットをCustomにしてカスタムカラーバッファに描画します。後続のフルスクリーンカスタムパスでオブジェクトIDの色を使います。

Clear Flagsでカラーをクリアしないと輪郭が残ります。

Layer Maskで輪郭抽出するレイヤーを指定できます。

床のレイヤーを除外

フルスクリーンカスタムパス

Fullscreen Shader Graphを作ります。

カスタムパスにFullScreenCustomPassを追加し、このシェーダーグラフが設定されたマテリアルをアタッチします。

シェーダーグラフ

シェーダーグラフでは、各ピクセルを中心とした正方形の4つの角にあるピクセルの色や深度などの値の変化を調べます。

まず、ピクセルサイズをスクリーンサイズに対して正規化した値とエッジ半径をかけます。

これとUVを足して右上角のUVを作ります。反対方向のUVも計算します。

ピクセルの片方の符号を反転させて、残りのUVを作ります。

これらのUVでオブジェクトIDカスタムパスで作ったカスタムカラーバッファの色を取得し、輝度を計算しました。

輝度はサブグラフで計算しています。R、G、Bに別々の値をかけてから全て足しています。

対角線の色の差をそれぞれ計算して、2乗してから足して平方根を計算します。値の変化が大きいほど大きな値になります。今回は2次元ベクトルにして長さを計算しています。

Stepノードを使い、閾値で白黒の値に分けます。さらにLerpノードで輪郭は指定の色、それ以外はシーンカラーにして、マスタースタックのBase Colorに入力します。

マテリアルでプロパティを変更できます。Thresholdは低く設定しています。

Threshold : 0.001
Threshold : 0.1

エッジの太さや色を変えられます。

5
20
1

コメントを残す

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