Unityでアニメ風表現をするにあたり、色々試行錯誤しながら作っております。
細々としていて忘れちゃいそうなので、そんなノウハウ備忘録として書いておきます。
今後も細かいことはこの記事に追加する予定。
色がおかしい! グローバルイルミネーション(GI、環境ライティング)の設定
グローバルイルミネーションは本来、ライティングをよりリアルにする為にあるのですが、アニメ風表現する際には邪魔になることもあります。なぜなら、マテリアルの色が環境光に影響され、本来の意図とは違う色になってしまうからです。
グレーの影色指定としたいところが青空の色と混じり、薄い青の影ができてしまいます。リアルっちゃリアルなのですが、自分の意図した色ではないのです。
なので、Unityのウインドウ→レンダリング→ライティングでウインドウを開き、以下の設定で色を固定します。
どのような色にするかは個人の好みもありますが、私はグローバルイルミネーションがギリギリ反映されないグレーにしています。
※シェーダー自体にグローバルイルミネーションの反映度を決めるパラメーターがあるものもありますが、ないものの方が多数なので、混在させる場合、上記の設定でいじる方が分かりやすいと思います。全てグローバルイルミネーションをコントロールできるシェーダーにする場合はこの設定は不要です。というか、グローバルイルミネーションを多少反映させた方が絵としては正解だと思います。
影がカクカク! 影の解像度をスクリプトで強制的に上げる(ビルトインレンダーパイプライン用)
アニメ風表現となると、影はシャッキリハッキリしてないといけません。影の印象が見た目の印象を決めてしまいます。しかしながら、デフォルトでは4K解像度まで対応となっています。
シャドウディスタンス(影ができる距離)を極限まで減らすことで、影の解像度が上がるのですがそれでも足りません。そこで、影の解像度を上げるスクリプトを使います。
このスクリプトをどれでも良いのでオブジェクトにアタッチして、影の解像度を8Kにしています。解像度をもっとあげればもっとキレイなんですが、マシンパワーを使うのでより多くの人に遊んでもらいたい時はそこそこの値で我慢しないといけません。
アウトラインが途切れる! ベベルでハードエッジの簡単な対策
立方体のような角ばっているメッシュにアウトラインをつけるとその特性上アウトラインが途切れてしまいます。
その対策として、ベベルでエッジを少し削ると良いです。もちろん、頂点が増えてしまう為負荷も増えるわけですが、反面、シェーダー機能に依存しないメッシュが作れます。
Blenderでする際は法線をハード化にチェックをいれます。こうすると、法線がベベル前のメッシュと同じになります。
アウトラインが崩壊しないメッシュの完成。ハードなエッジも維持しています。
一般的なトゥーンシェーダーのアウトライン途切れ対策だとノーマルマップを作って、それをもとにアウトラインを計算する方法が一般的です。
でも、それだとUVをノーマルマップ専用に作らざるを得ず、めんどくさいです。
ベベルを使う方式だとUVはそのまま、シェーダー変えてもOK、Blenderの編集だけで済むというメリットがあります。山ほどメッシュを表示させるならともかく、同人ゲームならこれで良いのではないでしょうか。