Search Unity

Unity 2018.3 シェーダーグラフのアップデート:Lit Master ノードの追加

, 12月 19, 2018

Unity 2018.3 のリリースで、HD レンダーパイプライン(HDRP)用の新しいマスターノード(Lit Master ノード)がシェーダーグラフに追加されました。これにより、HDRP に搭載された高度なシェーディング機能の多くがシェーダーグラフで使用できるようになりました!

HD Lit の高度な機能(「HD Lit Advanced Features」「HD Lit AF」)には、コートマスク、イリデッセンス(遊色効果)、透光効果、サブサーフェススキャタリング(表面下散乱)、異方性反射などが含まれます。

本記事では、これらの高度な機能のいくつかをご紹介し、HDRP とシェーダーグラフでそれらを使用して美しいアセットを作成する方法をご説明します。本記事用に作成されたサンプルプロジェクトが GitHub からダウンロード可能です。このサンプルプロジェクトには、盆栽の木が 1 本と、イリデッセンス(遊色効果)や透光効果をフル活用して作成された蝶が 1 羽収録されています。

ご使用開始にあたって

これらの高度な機能を使えば、信じられないような美しいシーンが作成できます。ただし、使用する前に確認していただきたい重要事項があります。まず、このマスターノードは HDRP でしか機能しないということ。そして、ライトウェイトレンダーパイプライン(LWRP)には、このノード内の高度なシェーディングオプションに相当する機能は提供されていないということです。もし PBR サーフェスの基本的な入力のみが必要な場合は、PBR Master ノードを使用することをお勧めします。

HDRP での起動を最も簡単に行うには、Unity Launcher または Unity Hub で High-Definition RP テンプレートを選択します。蝶のサンプルプロジェクトも HDRP を使用しています。

High-Definition RP テンプレートでプロジェクトを新規作成する場合、プロジェクト内で HDRP のバージョンを 4.1.0-preview から 4.6.0-preview に更新することが推奨されます。HDRP のバージョンを更新するには、メニューを Window > Package Manager の順に選択してパッケージマネージャーを起動し、パッケージのリストから 「High Definition RP」を選択してください。右上に「Update to」というボタンが表示されます。その右側に表記されるバージョン名が 4.6.0 になっていることを確認した上で「Update to」ボタンを押してください。

HDRP プロジェクトを開いた状態で、メニューを Create > Shader > Lit Graph の順に選択すると、新しい HD Lit シェーダーグラフが作成されます。新しく使用可能になった入力のいくつかがすぐに表示されます。HDRP で HD Lit マテリアルをご使用になったことのある方には馴染みだと思いますが、使ったことのない方は 「BentNormal」「CoatMask」といった表記は初めてかも知れません。

CoatMask を 0 より高い値(最大 1)にすると、透明な「コーティング」の効果がサーフェスに加えられ、オブジェクトの表面に薄くて光沢のある透明なシール材のレイヤーが乗ったような見た目になります。メッシュにエポキシコーティングを塗るようなイメージです。CoatMask は、車の塗装のようなビジュアルをつくるマテリアルの作成にも一般的に使用されます。

リンゴにアサインされたマテリアルの CoatMask の値を 0 と 1 の間で遷移させています。

CoatMask は Lit Master ノードのデフォルト入力のひとつですが、これは、目標のビジュアルを実現するためにどうしても必要な場合にのみ使用してください。CoatMask の値を 0 より大きくすると、シェーダーの負荷が高くなります。

BentNormal を使うと、アセットの間接ライティング(GI)の質を向上させる特殊なタイプのマップの入力が可能になります。AO マップと併用すれば、スペキュラーオクルージョンも使用可能です(メッシュの反射にオクルージョンを追加できます)。Substance Designer、XNormal、Knald などのアプリケーションからベント法線マップを生成できます。(ただし、ベント法線マップを正常に機能させるためには、その生成時に余弦分布(Cosine distribution)を使用する必要があります。)

スペキュラーオクルージョン用にベント法線マップを使用するには、シェーダー設定の Specular Occlusion Mode を「From AO And Bent Normal」 に設定する必要があります。この設定項目には、マスターノードの右上にある歯車型アイコンからアクセス可能です。

スペキュラーオクルージョンには「Off」「From AO only」「From AO and Bent Normal」「Custom」の 4 つのモードがあります。

Custom」を選択するとマスターノードに新しい入力が作成され、スペキュラーオクルージョンの制御を自由に行うことができます。例えば、この入力にゼロを接続するとすべての反射が無効になります。

マスターノードの設定メニューは Lit AF の各種オプションと同時に読み込まれます。シェーダーグラフ内で使用したいマテリアルタイプを選択したり、サーフェス関連のその他の便利な設定([例]表面を透明にするか不透明にするかなど)は、ここで行えます。

これらの設定を変更すると付加的な入力オプションがマスターノードに追加される場合があり、有効にした設定の組み合わせによっては、ノードが非常に大きくなる(そしてシェーダーの負荷が極度に高くなる)可能性があります。

Lit AF をフル活用!

デモプロジェクトで使用されているマテリアル

蝶のサンプルプロジェクトは、マテリアルタイプ「Iridescence」および「Translucency」 を活用して作られています。

まずは、蝶から見てみましょう!

蝶の羽の表面は、多数の微小な鱗粉がウロコ状に重なった複雑な構造になっています。これが、ヒトの眼には粉のように見えます。鱗粉は、反射率が非常に高く、キチン(外骨格の主な構成要素である透明なたんぱく質)の層の上に乗っています。.

この生物学的構造をシェーディング設定に変換すると、透光性があり(Translucent)、遊色効果を持ち(Iridescent)、金属的な(Metal)サーフェスということになります!

遊色効果(イリデッセンス/Iridescence)とは、ある種の特殊な表面において、光の照らされる角度に応じて表面の色が徐々に変化する現象です。これは、HDRP でしか利用できない高度なシェーディング機能のひとつです。

下の動画の蝶の羽にはイリデッセンス(遊色効果)が使用されており、蝶の羽ばたきに応じて羽の色が変化します。

Material Type を Iridescence に切り替えると、マテリアルノードに新しいオプションが 2 つ(IridescenceMaskIridescenceThickness) 表示されます。

このサンプルグラフでは、上述の 2 つの新しい入力の効果を分かり易くご覧いただけます。

プロパティ「IridescenceThickness」の値を増加させる

上の画像では、IridescenceMask によって、イリデッセンスのエフェクトの強さが 0 から 1(黒から白)にかけて調節されています。またイリデッセンスのエフェクトが作り出すグラデーションの色味が IridescenceThickness によって変化しています。

イリデッセンスを物理的に正確に使用したい場合は、IridescenceThickness がナノメートル(nm)単位であることを理解しておくと良いでしょう。 0 ~ 1 の範囲が、0 ~ 3000 nm にマッピングされます。

この蝶はモルフォチョウ属なので、羽の裏側の色・柄は表側とまったく異なっています。

この表現は、向きが相対する法線を持った 2 対の羽で作り出されています。光が羽を透過している表現を作り出すために、下側の面は Material Type を「Translucent」に設定してシェーディングされています。

「Translucent」タイプのマテリアルは、表面を透過する光をシミュレートします。光の強度は Thickness マップと Diffusion Profile によって調節されます。

Diffusion Profile を使用するマテリアルタイプには 3 つのパターン(Subsurface ScatteringSubsurface Scattering with TransmissionTranslucent(Transmission only))があり、それぞれ「趣」が異なります。

Transmission は、光がオブジェクトを完全に透過して反対側から出て来ます(蝶に使用されているもの)。Transmission を使用したマテリアルの場合、シックネス ( thickness ) マップを追加して、表面を透過する光の強度を調整することができます。

Diffusion Profile をどのように使用するかは、Subsurface Scattering(サブサーフェススキャタリング/表面下散乱)について(使用方法も含め)理解しておくと把握しやすくなります。

Subsurface Scattering は、ある程度の透明性を持つ表面に使用されます。草木の葉、果物、野菜、宝石、布地、歯、目、皮膚など、様々な種類のサーフェスがこれに当てはまります。光はこれらのマテリアルのサーフェスに入ると、マテリアルの内部で散乱した後、(往々にして入射点と異なる場所から)サーフェスの外へ出射します。

Subsurface Scattering を使用したサーフェスでは、ライトのエフェクトが全体的に柔らかくなり、隣接した領域へのライトの滲み出しや、サーフェス上の小さなディテールのボケが生まれます。

ライトがオブジェクト内に深く浸透すればするほどライティングは減衰し拡散(diffuse)されます。ライトが浸透できる「距離」はシックネスマップによって制御される値で、これが薄い(小さい)値になればなるほど(マップ内で黒に近ければ近いほど)Subsurface Scattering のエフェクトが強く現れます。

シックネスマップは手動でペイントすることも、Substance Designer や Maya などの外部アプリケーションで生成することも可能です。マップを生成するには、メッシュのサーフェス法線を反転させ、アンビエントオクルージョンをベイクした上で、アンビエントオクルージョンマップを反転させてください。

散乱の合計量と角度、結果の色(およびライトの滲み出しによって現れる色)は、Diffusion Profile によって制御されます。

HDRP の Diffusion Profile Settings は、Diffusion Profile を含んだ特殊なタイプのアセットです。

サンプルプロジェクトを使用されている場合、またはプロジェクトテンプレートを使って HD プロジェクトを起動された場合は、Diffusion Profile Settings アセットがすでに含まれています。新規作成が必要な場合は、メニューを Create > Rendering > Diffusion Profile Settings の順で選択してください。HD Render Pipeline Asset へのアサインも忘れずに行ってください。HD アセットはメニューの Project Settings > Graphics > Scriptable Render Pipeline Settings から簡単にアクセスできます。

Settings アセットが存在する場合、そのアセットにはプロジェクト内で現在使用している Diffusion Profile Settings への参照が含まれます。

蝶のサンプルプロジェクトには、カスタムの Diffusion Profile が 2 つ(羽の裏側用がひとつ、木の葉用がひとつ)が含まれています。

Diffusion Profile には各種のカスタマイズ用オプションがあり、ライティングがメッシュに浸透してどのように散乱するかを制御できます。

Scattering Distance はライトの散乱の強度と色を制御します。端的に言えば、オブジェクトのマテリアルに応じて、各カラーチャンネルからどの程度ライトが吸収・反射するかが制御できます。例えば人間の皮膚の場合、散乱した光は皮下の血液や組織の色になるので、赤みを帯びた色となります。

Index of Refraction(IOR/屈折率)は、ライトがサーフェスに入る時の屈折の角度に関係した設定です。これは計測可能な値で、一般的なマテリアルの IOR は多くのオンライン資料 に記載されています。例えば人間の皮膚の IOR は 1.4 ですが、その他の多くのマテリアルでは 1.3 や 1.5 になります。

Texturing Mode は Subsurface Scattering を使用しているオブジェクトにのみ機能します。表面色をぼかすことでライティングの見た目を柔らかくするので、通常は Pre-/Post-Scatter を使用します。ただし、サブサーフェススキャタリングが元からかかっている([例]スキャン画像や写真自体に含まれている)ため、すでにアルベドがぼかされている場合は、Post-Scatter のみを使うとよいでしょう。

これ以外のオプションは、Transmission を使用している場合(Translucent または Subsurface Scattering with Transmission)にのみ使用できます。Transmission Mode を変更するとシャドーイングに使用されるロジックが変更されます。基本的には、Thin は葉などの極度に薄いオブジェクトの場合にのみ使用し、その他の場合は Regular を使用することが推奨されます。

Transmission Tint は、既存のライトに追加する色で、既存の散乱している色にブレンドされます。Thickness Remap は、0 から 1 のシックネスマップを、アセットに適した範囲にリマップします。

蝶の羽や木の葉のような薄いオブジェクトには単純な Translucency(Transmission only) で十分です。より大きい、あるいは厚いオブジェクトの場合は、(オブジェクト内の光の透過だけでなく)光の散乱や、サーフェス上の異なる点からの出射のシミュレートも重要になります。Subsurface ScatteringSubsurface Scattering with Transmission は、このような場合に適しています。

シェーダーグラフで制作のワークフローを改善する

シェーダーグラフを使用してこれらの高度なシェーディング技術を実装すれば、イテレーションに掛かる時間を大幅に短縮できます。ビジュアルの調整には数え切れないほどのイテレーション回数が必要な場合がありますが、シェーダーグラフの迅速なワークフローによって、これがより簡単に行えるようになります。

シェーダーグラフはテクスチャに関わる様々な条件による負担を大幅に緩和できます。実際に、目標のビジュアルをたった 3 つのテクスチャー(ディフューズマップ、本体の法線マップ、タイリングのディテールの法線マップ)だけで達成することができました。シェーダーグラフを使ってある程度の試行を行った結果、追加的なテクスチャーを作成しなくとも、ディフューズマップのチャンネルと法線データを再使用してスムースネスの値を操作できることを発見しました。コード記述が不要なためイテレーションや試行が迅速になることはもちろん、各種プロパティや異なるインライン値の間で簡単に切り替えを行える(行ったり来たりできる)機能が強力にサポートすることが実証されました。例えば、特定の値を頻繁に変更していることに気付いたら、右クリックして「Convert to Property」 を選択します。これで、シェーダーを保存すると、そのシェーダーから作成するすべてのマテリアルのインスペクターでそのプロパティが使用可能になります。

蝶の見た目のイテレーションのプロセスの中で、結果的に多数のインライン値をプロパティとして利用可能にしました。このおかげで、ゲームビューで、精密で正確なライティングとポストプロセッシングとアニメーションのある状態で、蝶の微調整を行うことができました。(そして、これが可能でなければ私の目標とする遊色効果は実現できませんでした。)

このように、使用可能にしたパラメーターによって簡単に蝶の見た目を変えることができます。

蝶の羽の両面は似ていますが、マテリアルタイプやテクスチャ―は異なるものを使用する必要があったため、羽のロジックは部分グラフに変換し、カスタマイゼーション可能なプロパティは入力として保持しました。このおかげで、羽の両面に 2 つの異なる高度なマテリアルタイプを使用しているにも関わらず、両面を同時に編集することができました。

シェーダーグラフで素早いイテレーションが可能になるもうひとつの例として、盆栽の木の葉を見てみましょう。盆栽の葉の色を選ぶ際、何度も悩みました。このシーンをビルドした頃が秋だったので、秋の雰囲気がしっくり来るように思われました。

様々な色を試した末に、木が紅葉していくような、緑からオレンジ色のグラデーションを作ることに決めました。ただし、葉のテクスチャは編集したくありませんでした。幸運なことにシェーダーグラフを使用しているので、木のジオメトリのワールド位置を基に変化するグラデーションを使って色を変化させることができました。葉がその高さによって、異なる色をグラデーションから取得するようにしました。また、ノイズを加えて単調なグラデーションに変化を付けることで、より自然で有機的な見た目を作りました。これらの変更をすべて、テクスチャ作成ソフトウェアを使うことなく行うことができました。

また、色をテクスチャマップ内にベイクする必要もなく、マップ内の他のチャンネルをグレースケールテクスチャ用(Translucency のシックネスマップなど)に再使用することもできました。

さらに、葉のグラデーションをプロパティで制御可能にすれば、時間の経過と共に葉の色が変化するアニメーションを作ることもできました。

まとめ

シェーダーグラフの HD Lit Master ノードは、HDRP の高度なシェーディングオプションを使用したサーフェスの作成という新しい可能性を拓きます。ぜひ皆様も、シェーダーグラフの使いやすいワークフローで新しく利用可能となった HD Lit AF で、ビジュアルの可能性を開拓してみてください。今後もシェーダーグラフに関するお知らせをお楽しみに!Unity のシェーダーグラフチームは、美しいコンテンツを制作するアーティストの皆様を支援し続けるべく今後も尽力して参ります。

HD レンダーパイプラインの技術的詳細をさらに知りたい方は、SIGGRAPH で行われたプレゼンテーション(英語)をご覧ください。

19 コメント

コメントの配信登録

コメント受付を終了しました。

  1. Great to see this update – can’t wait to try it out!

    I just published a post about what I learned while trying to improve the visual quality of my Unity project as a programmer. Shader graph was definitely key to this – I used it extensively.

    I go over 5 other things I did to get better visual quality too.

    Please take a look, you might find it helpful – https://www.linkedin.com/pulse/programmer-art-unity-7-techniques-achieve-impressive-divij-sood/

  2. Hi Natalie,
    is there any combination to get the the tree leaves to work.

    Shader error in ‘Leaves’: incorrect number of arguments to numeric-type constructor at line 265 (on d3d11)

    I tried
    Unity 2018.3.0f2
    Unity 2018.3.1f1
    with
    High Defenition RP 4.6.0 preview,
    Shadergraph 4.6.0 preview

    and
    High Defenition RP 4.7.0 preview,
    Shadergraph 4.7.0 preview

  3. The Tree Leaves have never worked. Same error here.
    The Butterfly Wings outside you could refresh with resaving the ShaderGraph.

  4. Shader error in ‘Leaves’: incorrect number of arguments to numeric-type constructor at line 265 (on d3d11)

  5. When I opened this project from Github Desktop, there is no mesh in the scene.
    The console shows “AssetImporter is referencing an asset from the previous import. This should not happen.”
    Does anyone help me? Thank you a lot!!

    1. Oh,that’s my fault. It’s running great .It’s awesome project! Thanks.

  6. Sirius Bizdness

    1月 3, 2019 4:32 pm

    “These HD Lit Advanced Features, or HD Lit AF…”
    why

  7. Cloned & ran the sample in 2018.3…the butterflies and Bonzai tree shaders don’t render. I thought it might be enough to toggle on “Animated Materials”…alas, not so. What do I need to do to render the bonzai and butterfly wings?
    (I thought the sample would run as is)

    1. The project uses Git LFS as some files were too large for github, this could be what is causing you trouble. You can find instructions in the project’s readme for using Git LFS. https://help.github.com/articles/installing-git-large-file-storage/ may also be helpful.

  8. Isaac Surfraz

    12月 20, 2018 10:58 am

    Very cool, cant wait to give it a try! Unfortunately some missing terrain features in HDRP is stopping me currently, but will feedback to the team as soon as I do! Keep up the great work guys! :)

  9. No Meshes in SampleProject. Is it ony for me?
    Only Empty Objects are existing.

    1. google – Git Large File Storage (LFS)

    2. What Aahart said, and there are also some instruction in the readme to help set up Git LFS.

  10. “HD Lit AF”

    I hate everyone who was involved with that naming decision.

  11. Bruno Xavier

    12月 19, 2018 8:10 pm

    I find the default values’ “banners” on node pins a little misleading… At first I thought they were variables attached to the input, but then the pins all looking “empty” with wires attached made things even more confusing; until down the lines I see wires connected to the node then things began to make sense.

    1. They are default values that are fed into the node. Just for some that default value is 0 or nothing. However those default values can be altered without having to add another specific node just to do that, which is very handy.

  12. This blog post has helped me a lot, thanks.

  13. Bravo!

  14. Now we know what the Unity devs do on their time off….

    Make cool shader features! :P