さやちゃんぐbotブログ

シェーダーで遊んだりするブログです。

HDRPでキャラの顔陰がコワくなるのをなんとかする。

今年もアドベントカレンダーの季節がやってきましたね!

f:id:sayachang_bot:20201108132718p:plain

どーも、さやちゃんぐbotです。

もしみなさんがこの記事を目にしているとしたら、アドベントカレンダーに間に合ったということでしょう。

今日はですね、キャラの顔で鼻とかくちびるのところで陰がコワいかんじ出ちゃうやつをHDRP環境でなんとかできないか?ってことを考えてみたいと思います。

 

それではやってまいりましょう!

 

バージョン

Unity: Unity2020.1.6f1

HDRP: HDRP8.2.0

まれによくあることですが、3Dを扱っているとキャラの顔でホラーな陰が出てしまうことがあります。顔を明るく照らしたいのに、そのぶん鼻や口にきつい陰になってしまう現象です。これはHDRPでも起きます。

オーケー、チートをしましょう。良く知られた手法に、法線転写があります。メッシュの形状とは異なる、もっとフラットな法線を使うことができれば、顔の強い陰を緩和できるはずです。

 

この分野は、先人たちがすでにいろいろとやっているジャンルです。

ありけい師の記事を見てみましょう。顔の形状が球になっているような状態を仮定し、顔メッシュの法線を球の法線に対して線形補完してソフトにするような実装をしています。

unityshader.hatenablog.com

 

さて、同様の手法をHDRPでやってみましょう。今回はShaderGraphで組んでみます。

f:id:sayachang_bot:20201108134140p:plain

 

先にSSSの部分について。

マスターノードはLit Masterです。これは顔の肌にSSSを使いたかったため、Diffusion Profileを入力できるノードを選んだということです。

f:id:sayachang_bot:20201108134752p:plain

SSSを使うかどうかだけマテリアルのパラメータで変更できるようにし、SSSで使うDiffusion Profileをノードから固定で指定しています。

 

さて、本題の法線転写の箇所について。

f:id:sayachang_bot:20201108135022p:plain

置き換え先の法線で仮定する球の中心座標を指定できるようにパラメータを用意しています。このパラメータは頭の形によって中心位置を調整できるように追加してあります。あとはこれを頂点座標と引き算してから正規化すれば、法線のベクトルが求められることになります。

あとはメッシュの法線をこの新しく求めた法線に近づけていけば法線転写が実現できます。線形補完した値をLit Masterに与えればルックが確認できます。Lerpノードに与える0-1の値をスライダーで指定できるようにしているため、これを調整すると本記事の冒頭にある画像のように、陰の強さを調整できるようになります。

 

このノードサンプルについてはGitHubに置くつもりなので、興味を持たれた方はお試しください。(12/1現在ではまだ置いてません。。でも、シンプルなシェーダーなので、上の画像を見ながらShaderGraphを写経してもすぐに作れるハズです)

github.com

 

いかがでしょうか!

球の形状で法線転写を行うなら、コアとなるロジックは比較的シンプルなShaderGraphで実装できます!

みなさまもぜひHDRPでトゥーンなキャラへのライティングを楽しんでみてください!!

ではでは。