[Unity] ハードエッジなオブジェクトにアウトラインをつける

こんなの簡単にできるだろと思ってたらどハマりした。
二度と調べ直したくないので備忘録。Blenderを使います。

アウトラインの表現方法

UnityのStandardAssetsにあるToon/OutLine系シェーダーを使ってもアウトラインは出せるけど、立方体などトガったオブジェクトでは角でラインが割れます。

アウトラインの表現方法は何種類かあるらしく、

  1. メッシュを法線方向に移動しレンダリングしてアウトラインを表現
  2. オブジェクトを拡大描画したものをアウトラインとする
2の方法はうまくいかなかった。


最終的には1の方法でこんな風になった。エッジでアウトラインが割れる問題は解決したけど妙な黒いラインが出てます。これには理由があります。

色々と調べてみると、Unity内で法線をいじるのは現実的では無いようなのでBlenderで法線を変更しました。この辺りとかこの辺りを参考にしたが前者ではスクリプトがうまくいかず..(単にBlenderの使い方がわかってないだけ)

前者の頂点カラーを法線情報として扱うアプローチはShaderForgeのQ&Aにも似たようなのが載ってました。

後者はBlenderで球体の法線を立方体に転送してます。結果的にSquareの角頂点はいい感じに斜めを向いてくれるのでその方向に1の方法でレンダリングしてます。
代償として法線が球体を描いているので妙な黒いラインが現れてしまいます。
この辺はシェーダーでごまかすとするかなあ...

まとめると


  1. アウトラインをつけたいオブジェクトをBlenderに読み込み or 作成
  2. 球体の法線を転送、エクスポートしてUnityに取り込み
  3. メッシュを外側に拡張するシェーダーを当てる(OutLine)


ちなみにシェーダーがかけないのでShader Forgeで書いてます。OutLineはこんな感じ。



シェーダーもBlenderもわからない状態からここまでたどり着くのにとても時間がかかりました。『アウトラインつけたいな』と思っただけなのに思わぬ足踏みを食らったので、似たような境遇にいる方の助けになればと思います。
しかしジオメトリまでいじることになるとは...

コメント