【Unity】HDRPを使ったキャラクターの肌表現(Subsurface Scattering)

※こちらの記事の内容+αと、実際の作例を収録した電子本をBoothに置いていますので、興味のある方は是非見てみてください。
[『Unity HDRPではじめる写真撮影(技術書)』](https://maronvtuber.booth.pm/items/3406370)


こんにちは、八ツ橋まろんです。

Unity HDRP Raytracingを使ってキャラクターの写真撮影をしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/5565329c-3597-617a-8c6e-8d3fdd3b8b10.png)



そもそもHDRPって何？っていうと、Unityの中のハイレベルなレンダリング手法のことです(ざっくり)。通常のUnityよりもきれいなライティングでよりフォトリアルな表現ができるのが特徴です。下図はどちらもRealtimeのDirectional Light 1灯で照らしたSceneですが、HDRPの方がよりフォトリアルな見た目になっているかと思います。

[左：通常のUnity　右：Unity HDRP]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/3ef63968-71cb-3273-1185-02dacf4672e7.png)

Unity HDRP Raytracingのプロジェクトの作成方法や、基本的な設定方法は[pixivFANBOXの記事](https://maron.fanbox.cc/posts/2571080)や、冒頭で紹介した[Boothの電子本](https://maronvtuber.booth.pm/items/3406370)で解説していますので、よければお試しください。


さて、HDRPでは使用可能なShaderが従来と異なるため注意が必要です。
下図のように、従来のStandardシェーダーではエラーとなりピンク色になってしまいます。ほとんどの場合、代わりにHDRP/Litシェーダーを使うことになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/1a388407-26f1-25de-6438-a207b7553487.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/f26e40f4-49e3-1694-57c8-6a147c274275.png)

ユニティちゃんトゥーンシェーダー(UTS2)などに代表される、『アニメ調キャラクターでよく使われるトゥーンシェーダー全般』も、ほぼ全てエラーとなるため、代わりにHDRP/Litシェーダーを使うことになります。
(余談ですが[『Unlit Toon Shader』](https://maronvtuber.booth.pm/items/2860844)は素朴な実装によりHDRPでもエラーにならないように作ったUnlitなトゥーンシェーダーです)

背景やキャラクターの服などはHDRP/Litシェーダーでフォトリアルにすると概ね良い結果を得られます。
[左：明るいところで撮影　　右：暗いところで撮影]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/5e8d0445-9139-628b-b568-6541d3a9032f.png)


対して、キャラクターの肌はHDRP/Litシェーダーでこんな見た目になります↓↓↓↓
[左：明るいところで撮影　　右：暗いところで撮影]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/cf3ec6a2-6e36-5117-30d7-5261c692c72e.png)


暗いところでは悪くない結果になりましたが、明るいところで撮影したほうは、口元や鼻、目元の陰影によりフィギュアっぽい見た目になっています。肌というよりはプラスチックのような固い印象ですね。これは、キャラクターに対してトゥーンシェーダーではなく、従来で言うStandardシェーダーに相当するシェーダーを使ったためです。

しかし前述の通り、既存のトゥーンシェーダーは使えないことと、せっかくHDRPのシェーダーが用意されているので、これを使っていい見た目が作れないか考えてみます。(もちろん、HDRP/Litシェーダーはきっぱり諦めてHDRPで使えるトゥーンシェーダーを探して使う、というのは良いですが、HDRP/Litシェーダーの理解をする前に見切りをつけてしまうのはもったいないですので)

HDRP/Litシェーダーは設定項目がとても多く、色々な質感を表現できます。初期状態の『Standard』モードで使った場合、金属やプラスチック、木材のような物質に合った質感になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/3bb5fe10-2b86-d966-fd81-449359ea5000.png)

『Subsurface Scattering(SSS)』モードは、肌のようなわずかに透明感のある素材の光の透過・反射具合を再現するモードです。

肌のようなわずかに透明感のある素材とは、どういうことかというと、

『プラスチックのような物質は光を全て表面で反射しますが、肌は表面の反射に加え、ちょっと光が侵入してから反射して出ていく光もあります。これにより、光に当たると肌の端の方は少し赤みを帯びます。』

もっと具体的に例を言うと、、、

『部屋の蛍光灯を見上げて、手をかざして光を遮ってみてください。すると、指の間の水かきの部分が少し明るく、そして赤みを帯びます。蛍光灯から水かき部分に侵入した光が少し貫通して目に届いているためです。赤色は肌の中の色です。』

肌はわずかに透明な物質で、表面で全ての光を反射するわけではないのですね。一部はある程度侵入してから反射し、肌の薄いところは光がいくらか透過します。


SSSでは『Diffusion Profile』というものを作成することで、これを表現します。Projectウインドウで右クリック→Create→Rendering→Diffusion Profileを作ります。これをSSSのDiffusion Profileの項目に入れて、Fixを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/78f0db31-e25f-6aba-8cd5-52eacfb17180.png)

Diffusion Profileのパラメータは下図の通りです。パラメータの調整によって、最終的に、一番下にあるカラーバーができあがります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/1052b3c8-0f03-3e3f-7bda-2804c43f67f4.png)

肌の場合のパラメータの例は以下です。これらに正解はなく、ライト環境やポストプロセスを含めて調整し、結局のところ最終的な見た目が好みかどうかだけで決めて構いません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/24bd9c89-922d-5cb6-77a9-55c817918678.png)

そして、肌のマテリアル側でThicknessを調整します。例えばThicknessを0.2にすると、Diffusion Profileで作成したカラーバーの中の0.2に相当する色が適用されます(下図)。
マスクを使うことで、Thicknessを場所ごとに変えることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/5d5bffb0-fff0-0553-79a7-740738f05b29.png)

SSSによる色変化とぼやけによって、プラスチックのような質感から、肌のような柔らかい質感に近づいたのがわかるでしょうか。下図では対比として、プラスチックの質感に対して単純に赤味を加えた場合も一緒に載せています。
[左：SSS　中：Standard　右：Standard + BaseMapに少し赤みを足した]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/1a2bec50-224e-d371-dd5d-792e9c10ea17.png)

HDRP/LitシェーダーのSSSモードを使うことで、やわらかい肌の素材を表現することができるようになりました。
この状態から、ポストプロセスで色調整をしたり、3Dモデルの顔の影が気になる場合は、法線を調整したりなど工夫すると、より理想的な写真を撮ることができます。

さて、HDRP/Litシェーダーでの肌表現について書きました。キャラクターの『映え』を考えると、もっと議論するべきところがありますが、この記事はSSSの紹介のためここまでとします。この記事の内容に加え、さらに踏み込んで『HDRPでアニメ調キャラクターを見栄え良く撮影する』という話は[pixivFANBOXの記事](https://maron.fanbox.cc/posts/2481231)や冒頭で紹介した[Boothの電子本](https://maronvtuber.booth.pm/items/3406370)に掲載していますので、興味のある方は是非読んでみてください。
(キャラクターにアウトラインを付けたり、実際に写真を撮るための色調加工だったりなど)

それではっ🌟

[八ツ橋まろん](https://twitter.com/Maron_Vtuber)