Open3
UnityでOutline(輪郭線)を出す方法
Unity / UEで検討してみる
方法は色々?
論点はどうやって輪郭を検出するのか?と言うところらしい
輪郭を検出する方法
- 深度(デプスバッファ)
- 法線
あたりが有力な選択肢。
検出しないのであれば、ステンシルバッファに輪郭部分の情報を書き込むという手もある。
その場合はやはり法線情報をもとにステンシルに書き込むことになるかも。
どのタイミングで処理するのか?
-
ポストプロセス
-
オブジェクト描画
-
2pass使って法線拡張でアウトラインを描画する方法
-
3pass使って法線拡張でアウトラインをステンシルに書き込む方法
-
深度情報を参照してオブジェクトのシェーダーでアウトラインを書き込む方法
-
ポストプロセスで深度を使ってアウトラインを書き込む方法
-
ポストプロセスで法線を使ってアウトラインを書き込む方法
追記:以下を見るのが早いか?
ポストプロセスで深度を使ってアウトラインを書き込む
セットアップは楽かも?
最大の特徴はすべての描画オブジェクトにアウトラインが生えることかも。
もちろんデプスバッファに書き込まないようにするとか、シェーダー内で描画オブジェクトを特定することはできそうだが…
(UEの時はカスタムバッファの値を参照して対象を決めたことがある)
また、ポストプロセスでfragmentシェーダーとして処理するのでアウトラインをつけるオブジェクトが多い場合はポストプロセスの方が軽量な可能性もある
ポストプロセスで法線を使ってアウトラインを書き込む
わざわざ法線を使うメリットはあるのか…?
法線の違いを輪郭として検出するので深度にあまり違いがないケースでも使用できる。
どちらかというと法線と深度を組み合わせて使う方が現実的な気はする。
法線拡張の2passでアウトラインを書き込む
オブジェクトごとにアウトラインシェーダーを使ったマテリアルを使って適用
アウトラインを描画したいオブジェクトごとにマテリアルを適用する必要あり。
ただし、法線が連続的でないオブジェクトにおいて綺麗にアウトラインが出ないことが知られている。
ステンシルを使ってアウトラインを書き込む