Open3

UnityでOutline(輪郭線)を出す方法

KaibaKaiba

Unity / UEで検討してみる
方法は色々?
論点はどうやって輪郭を検出するのか?と言うところらしい

輪郭を検出する方法

  • 深度(デプスバッファ)
  • 法線
    あたりが有力な選択肢。

検出しないのであれば、ステンシルバッファに輪郭部分の情報を書き込むという手もある。
その場合はやはり法線情報をもとにステンシルに書き込むことになるかも。

どのタイミングで処理するのか?

  • ポストプロセス

  • オブジェクト描画

  • 2pass使って法線拡張でアウトラインを描画する方法

  • 3pass使って法線拡張でアウトラインをステンシルに書き込む方法

  • 深度情報を参照してオブジェクトのシェーダーでアウトラインを書き込む方法

  • ポストプロセスで深度を使ってアウトラインを書き込む方法

  • ポストプロセスで法線を使ってアウトラインを書き込む方法

追記:以下を見るのが早いか?
https://light11.hatenadiary.com/entry/2018/05/13/183314

KaibaKaiba

ポストプロセスで深度を使ってアウトラインを書き込む

セットアップは楽かも?
最大の特徴はすべての描画オブジェクトにアウトラインが生えることかも。
もちろんデプスバッファに書き込まないようにするとか、シェーダー内で描画オブジェクトを特定することはできそうだが…
(UEの時はカスタムバッファの値を参照して対象を決めたことがある)

また、ポストプロセスでfragmentシェーダーとして処理するのでアウトラインをつけるオブジェクトが多い場合はポストプロセスの方が軽量な可能性もある

https://qiita.com/Shinoda_Naoki/items/734fee861fe8abfca228

ポストプロセスで法線を使ってアウトラインを書き込む

わざわざ法線を使うメリットはあるのか…?
法線の違いを輪郭として検出するので深度にあまり違いがないケースでも使用できる。
どちらかというと法線と深度を組み合わせて使う方が現実的な気はする。

KaibaKaiba

法線拡張の2passでアウトラインを書き込む

オブジェクトごとにアウトラインシェーダーを使ったマテリアルを使って適用
アウトラインを描画したいオブジェクトごとにマテリアルを適用する必要あり。
ただし、法線が連続的でないオブジェクトにおいて綺麗にアウトラインが出ないことが知られている。

https://qiita.com/studio_meowtoon/items/1d06ab57a6e62bedf092

ステンシルを使ってアウトラインを書き込む

https://light11.hatenadiary.com/entry/2018/05/07/011703