レイヤ シェーダを使ったスキン シェーディング

このセクションには、スキン レンダリングに対してレイヤ シェーダを使用する、より高度なサンプルが含まれています。これは、小さな .mi スニペットを使って個々のステップをリストせずに、単に個々のスニペットを記述するという点で、より高度です。これは、別のコンテキストで適用される「最初のチュートリアル」ページで実行される「操作」とまったく同じです。

基礎知識

一般に、これらのシェーダは、古い misss_ のほとんどの処理の後継として置き換えられるものです。これには、いくつかの理由があります。

misss_* シェーダとレイヤ シェーダは大きく異なっているため、実際にはこの 2 つのシェーダを 1 対 1 で比較しても意味はありません。misss_* シェーダは、実行可能な計算の複雑さとシェーダに求められる機能が現在とは異なる時代に作成されました。これらのシェーダは長年にわたって大いに役立ってきましたが、現在では時代遅れになり、新世代のシェーダの登場が望まれています。

misss_* シェーダの古いスキン シェーディング チュートリアルのレッスンとアイデアの一部は今でも使用できますが、何点かの違いもあります。その違いを以下に説明します。

拡散シェーディング

シンプルな頭部を使ってまっさらな状態からスタートしましょう。このチュートリアルでは、ポリゴン数が非常に少なく、大部分がフラット カラーで、手続き型テクスチャ以外はテクスチャ マップは使わない頭部モデルを使用します。言うまでもありませんが、実際のプロダクションで真に写真のような結果を得るには、以下に示すほとんどすべてのパラメータにテクスチャが適用されます。しかし、シンプルなフラット カラーでどこまで実現できるか検討してみましょう。これは非常にやりがいがあります。

頭部には、ライト カードとして使われている 2 つのポータル ライトによって照明が当てられています。これはつまりソフト ライティングが行われているということです。

次のイメージは、シンプルな既定の mila_diffuse レイヤを、mila_material_std にプラグ インされている mila_layers に配置しただけの結果です。取得したイメージは以下のとおりです。

現在のスキンは起伏が激しく、バンプはスキンの全体的な外観にとって、非常に重要な部分です。実際は、バンプのないスキンはレンダリングできません。そのため最初の作業では、シンプルな手続き型バンプ マップを作成したばかりの拡散レイヤの「バンプ」入力に単純にアタッチして、バンプ マップを適用します。

このチュートリアルでは、説明するエフェクトをよりわかりやすくするためバンプは実際よりも少し大きめです。

上記のイメージはでこぼこですが、バンプが非常に粗いため、石のように見えます。ソフト ライティングにもかかわらず、バンプ間のシャドウの暗部は非常に濃く、実際のスキンでは光線はスキンの下で周囲とのわずかなにじみが発生します。

凝ったスキン カラーをスキンに指定すると、次の結果が得られます。

サブサーフェス散乱(SSS)

ここで、散乱コンポーネント シェーダに注目しましょう。mila_scatter を追加して、拡散の下のレイヤに配置し、シェーダ R、G、B の散乱半径に前方の散乱と後方の散乱で同じ値 30 mm を設定しました。

また拡散レイヤで使用したものと同じバンプ マップを設定し、(今のところは)拡散レイヤを完全にオフ にして、スキャッタリングだけを表示します。これが、すべてのカラーに 30 mm スキャッタリングを使って取得したレンダリングです。

上の例では、スキャッタリングだけが表示され、適用したバンプ マップは効果がないという点に注意してください。サブサーフェス スキャッタリングは、サーフェスの下で実行され、バンプはサーフェスの上に適用されるため、これで問題ありません。

このスキャッタリングは、以前の misss_* シェーダを使って取得した場合と非常によく似ていますが、ライト マップなどに関するトリッキーな設定がないという点が異なっています。ただしこの例からわかるように、実際には動作がごくわずかに異なります。減衰は、古いシェーダのように、ハードコード化されたべき関数に従うのではなく、指数関数的に実行されます。この違いはかなり些細なものですが、確かに存在しています。

つまり、古い misss_* シェーダの分散半径として指定された値は実際に半径で、スキャッタリングはこの半径内でのみ発生しますが、これらのシェーダではこのようなことはありません。

指数関数的な減衰は終了せず、小さくなるだけです。「終わり」がないため、設定した半径はスキャッタリングが「停止」する半径ではなく、実際は、スキャッタリングのウェイトが 10 % に減少する半径です。

しかし、光線の潜在的な寄与の散乱のために、シーン全体をサンプリングすることは望ましくないため、実際にはサンプリングを実行する最大半径の上限が存在します。それが sampling_radius_mult パラメータです。このパラメータは、他の半径パラメータで指定された最大半径を使用し、その半径にこのパラメータの値をかけた範囲内の(サンプリング)光線が考慮されます。この例では、すべての半径は 30 mm で、sampling_radius_mult を2(既定)に設定すると、60 mm の半径内でサンプリングされます。

一般的に、既定値 2 で十分です。すべての半径距離が 10 % にまで落ちることを意味するため、半径 x 2 は 1 %、半径 x 3 は 0.1 % を意味します。このような強い光線がオブジェクトに当たっているものの、最終イメージに貢献する光線が 1 % 未満になる場合のみ、このパラメータを増加します。このパラメータを大きくすると、レンダリング時間が不必要に増大し、ノイズが増加することがあります。

カラーごとのスキャッタリング半径

散乱の効果を表現できたとしても、すべてのカラーに対して 1 つの距離のみ散乱させることは、カラー バンドに関して有用ではありません。一般的には、光線がマテリアルに吸収される場合、波長が短い(光線の青が強くなる)ほど、吸収速度は速くなります。

赤の分散半径を 20、緑を 10、青を 5 に設定すると、次の結果が得られます。

上のイメージは、スキンの外観に一歩近づきました。

半径の値を大きくすると、その効果がさらに明確に現れます。

上のイメージは、色成分が異なると、スキャッタリング距離も異なることを明確に示しています。また耳を通過する光線は、厚さに応じて黄色から、オレンジ、さらには赤まで、さまざまなシェードを通過するという点にも注意してください。新しいシェーダでは、これらのエフェクトはすべて自動的に実行されます。古い misss_* シェーダでは、耳を通過するスキャッタリングは赤だけでした。これは分散カラーを使って、この色を赤にしたためです。分散カラーはのままです。

以前は、スキンにさらに近いエフェクトを得る場合、表皮スキャッタリング レイヤと皮下スキャッタリング レイヤを使ったマルチレイヤ スキャッタリングが必要でした。スキンのさまざまなレイヤに対してスキャッタリングを分離することは今でも便利な場合がありますが、たった 1 つのスキンで、実際にどこまでできるか見てみましょう。

赤 30 mm、緑 10 mm、青 5 mm など、スキャッタリングが適切に実行されるように値を微調整します。これにより、次の結果が得られます。今後はこれを使用します。

上のイメージのスキャッタリングは妥当に分散しているように見えますが、色が白すぎます。ただしこれは、実際には重要な機能です。

misss_* シェーダに関しては、各レイヤには個別の色があるため、特定の「最終」カラーに合わせることが困難で、レイヤ間のバランスを変更すると、色がずれてしまうという問題がありました。

新しいシェーダではこの点が非常に簡単になりました。R/G/B スキャッタリングの数を合計すると、全体的な分散カラーになる傾向にあるからです。したがって、スキャッタリングが見えないほどオブジェクトから離れても、スキャッタリング カラーは正確で、この例の場合は白です。これは後でテクスチャを実行する時に役立ちます。

しかし、スキンには白ではなく少し色を付けたいため、前面と後面の両方のスキャッタリング カラーを、拡散レイヤで使用した色と同じスキン カラーに変更します。次の結果が得られます。

ここで注目することは、上記のカラーは、拡散レンダリングと全体的なカラー トーンが同じだということです。これはテクスチャリングに非常に適しています。ここで覚えておくことは、スキャッタリングとは光線をぼかすということです。そのため、非常に詳細な情報が多数あるスキャッタリング パラメータにテクスチャをマッピングすることは賢明ではありません。一般的なエラーは、隙間の塗り潰しシャドウが含まれているスキャッタリング コンポーネントにテクスチャをマッピングすることです。こうすると、光線はその隙間にスキャッタリングすることができなくなるため、これは誤りです。隙間へのスキャッタリングこそが、サブサーフェス スキャッタリングを実行する目的です。

ここでは、これらの全体的なカラー トーンがよく似ているため、レイヤのウェイトを調整するだけで、スキャッタリング量と拡散量のバランスを簡単に取ることができます。

そのため、拡散レイヤをオンに戻してウェイトを 0.5 に設定すると、次の結果が得られます。

上のイメージは、拡散とスキャッタリングを 50 対 50 で組み合わせています。ご覧のとおり、全体的なカラーはほとんど同じですが、サーフェスの見た目の柔らかさだけが変更されました。このため、古いシェーダを使用した場合と比べて、外観の加工が非常に簡単になります。

スキン光沢

ここでは、反射を取り上げたいと思いますが、反射するものがなければ、それほど興味深いことは起こりません。そこで、サンプル シーンに環境マップを追加し、ファイナル ギャザリングをオンにして、上記の環境からオブジェクトをライト アップします。

上のイメージはなかなかのものですが、非常に「乾燥した」顔に見えます。実際のスキンには、最上位のオイル レイヤと、照明を適切に反射する他のレイヤがあります。

したがって、最上位に mila_reflection レイヤを配置し、他のレイヤと同じバンプを設定します。結果は次のようになります。

残念なことに、非常に多くの種類のコーティングに対する反射は、フレネル カーブに従うということを忘れていました。しかしこれは、レイヤのエネルギー保存の法則を明確に表しています。上部に 100 % の反射を追加すると、他に何も通過しなくなります。また、レイヤのインテリジェントな処理のおかげで、実際にこのレンダリングはより高速に実行されます。このレンダリングでは、サブサーフェスのスキャッタリング計算がまったく実行されないためです。

反射レイヤの angular_mode を 1 に変更し、fresnel_ior を 1.4 に設定すると、次のような結果が得られます。

この男の人は本当に汗かきかもしれませんし、浴槽から出たばかりかもしれません。

もちろん、上記のレンダリングでは、既定の完全スペキュラ反射レイヤを使用しました。しかし、スキンの反射は非常にぼやけています。反射レイヤの glossiness の値を 0.42 に落とすと、次の結果が得られます。

上のイメージは、スキン全体の光沢がより実際に近くなったことを示しています。

一般的に、スキンにはさまざまなタイプの光沢があります。基本となるグリース、その上の汗などです。レイヤ シェーダをレイヤの上に重ねて配置しても、実際にペナルティは発生しないため、まずこの処理だけを実行してから、2 番目の光沢のあるレイヤを追加します。

その上に別の mila_reflection を追加し、glossiness を 0.6、レイヤの angle_mode を 1、fresnel_ior を 1.5 に設定すると、次のようなレンダリングが得られます。

新しい光沢レイヤは完全に均一なため、この結果は確かに少し人工的に見えます。リアリズムの点で、反射をテクスチャに分割する、サーフェス全体で光沢を修正するなどのテクニックが使えます。2 つの完全に均一な光沢レイヤを除けば、かなり自然に見えます。少しオイルを落とす必要があるかもしれませんが、まあ悪くない見栄えです。

仕上げ、ダート、その他のエフェクト

さあ、さらに先に進みましょう。ここまでは、わずかな数のレイヤしか適用していません。

実際のスキンは、さまざまな物を使ってカバーすることができます。自動レイヤ化ロジックがここでも大いに役立ちます。たとえば、別の色付き拡散レイヤを上に追加するだけで、仕上げのようなエフェクトを追加することができます。

緑の mila_diffuse を配置して、レイヤに他のレイヤと同じバンプ マップを適用し、マスクとして特定のテクスチャを適用するだけで、次のような結果が得られます。

このようなエフェクトを実行する際には、現実での動作について考えることが重要です。仕上げにスキンをカバーします。それでは、スキンの拡散カラーでスキンをペイントするのではなく、実際のカバーとしてスキンを作成したらどうでしょうか。

もちろん、このようなパターンとしては、兵士が使用するグリース ペイントが思い浮かびます。そこで、以前と同じバンプとマスクを使って、フレネルによりウェイト付けした、別の光沢反射レイヤをペイントの上に追加します。次のような結果が得られます。

これはまずまずの戦闘用ペイントです。

しかし、マスクとバンプ マップをあちこちで繰り返し使用していることにお気付きですか。相互にカスケード表示するレイヤ シェーダ機能は、ここで本領を発揮します。

前とまったく同じレンダリングをさらに便利に設定するには、スキンを作成する複数のレイヤを 1 つの mila_layers にまとめ、戦闘用ペイントを作成する複数のレイヤを別の mila_layers にグループ化し、この 2 つを 3 番目の mila_layers にレイヤ化します。概要を以下に示します。

  Reflection __
               \
  Diffuse _____"warpaint" layers ___
                                     \
                                 "overall" layers ---> material ---> mental ray material
  Reflection  ____                   /
                  \                 /
  Reflection  ___ "skin" layers __/
                  //
  Diffuse _______//
                 /
  Scattering ___/

このセットアップにより、バンプの適用箇所を削減できます。「全体」レイヤにバンプを適用し、1 回の操作で「スキン」レイヤと「戦闘用ペイント」レイヤの全体にそれを適用できます。また、「戦闘用ペイント」をマスクするために使用したマスクは、個々の「拡散」コンポーネントや「反射」コンポーネントではなく、「戦闘用ペイント」全体に 1 度だけ適用する必要があります。

この論理的な分割は、さらに別のマテリアルをミックスする場合に、さらに強力になります。

これは良いアイデアであることを理解したので、「ダート」と呼ばれるさらに別の mila_layers レイヤを作成し、このレイヤを「全体的な」レイアの上に接続し、ウェイトとして特定のテクスチャを指定します。このレイヤ ノードの内側に mila_diffuse を追加して、グレーに設定します。次のような結果が得られます。

ここでは、グレーのダートを追加しました。ダート レイヤに意図的にバンプ マップを配置しなかったため、皮膚の毛穴が覆われているかのように「平坦」に見えるということに注意してください。また、ダートが、耳から放出されるスキャッタリングをうまくブロックしているということにも注意してください。

既に理解しているように、「ダート」にバンプを追加する場合、拡散ノードに直接追加するよりも、「全体」レイヤの「ダート」レイヤに追加する方が適切です。そこで、特定の(別の)バンプを追加して、色を茶色に変更すると、次のレンダリングが得られます。

乾いた泥のレンダリングとしてはなかなかです。不規則なバンプを追加すると、顔にこびりついた泥を表現できます。

これで、乾いた泥を濡れた泥に変換したり、泥の色を変更して血をシミュレーションする場合での、ネスト化したマテリアルの利点について明らかになりました。拡散カラーを赤に変更し、(「ダート」レイヤの内側の)拡散の上に mila_reflection を適用し、その angle_mode に 1 を設定し、fresnel_ior を 1.4 に設定すると、次のイメージが得られます。

どうです。ネスト化した mila_layers にマテリアルをあらかじめ配置することにより、バンプ マップやマスクを複製しなくてもプロパティの変更だけで簡単に「サブレイヤ」をもう 1 つ追加することができます。これは、ごく単純に泥を直接血に変換したものです。

もっとも、これでは血としては少し濃すぎでしょう。そこで「ダート」レイヤのウェイトを下げてみます。すると、次のイメージが得られます。

これで、血が少し透けたような感じになりました。

現在、4 つのレイヤで、8 つの個別レイヤ シェーダが格納されています。蓄積できる数に制限はありません。繰り返しになりますが、上のイメージは、稚拙な手続き型テクスチャを使ったシンプルなモデルを示したものですが、それでもまずまずに見えます。もしアーティストがすべてのテクスチャを作成したらどうなるか、想像してみてください。

高度なレイヤ

レイヤは物理的というよりもむしろ論理的なものであるということを思い出すために、「全体」レイヤの他のすべてのレイヤの上に、チェッカーボード テクスチャを適用した mila_transparency を追加しました。これにより、次の結果が得られました。

上のイメージでは、グローバルなカットアウトを作成しました。戦闘用ペイントを施した、この哀れな血まみれの男の(空っぽの)頭をのぞいてみましょう。

この処理を行ったのは、レイヤの論理を明確に示すためです。一番上に配置された透明度のウェイトが 100 % の場合、100% 透明になります。簡単です。泥と血にまみれた、戦闘用ペイントをした兵士をその下に配置しましたが、見た目の違いはありません。100% 透明です。また、透明レイヤではなく mila_material の"visibility" 入力を使用した場合に、このカットアウトが深度バッファに適切に現れ、入力を extra_color バッファに割り当てることで、作成されたマットで表示されることに注目してください。

これにより、多くの強力なエフェクトが可能になります。またレイヤの順番により、さまざまなコントロールができます。たとえば、グリッド バンプ マップがある mila_reflection レイヤに対して「透明」シェーダをスワップすると、次の結果が得られます。

今度は、この兵士もそうひどくないように思えます。なんだか、アーノルド シュワルツェネッガーに少し似ているような気がしてきました。でも、金属の上にも少し血があった方が自然だと思いませんか。

「ダート」を入れ替えるシンプル方法は、反射金属レイヤの上に配置することです。次のイメージが得られます。

....以下同様です。ご覧のとおり、実際にはハード上の制限はありません。また、レンダリング時間が積み上がるようにも思えません400 枚のレイヤは、単にレイヤの量(必ずしもそうだというわけではありませんが、ここでも、最上位レイヤが不透明な拡散の場合、他のレイヤはいずれも実行されません)を管理するためのオーバヘッドによって、多大な時間がかかることがあります。しかしアーティストの管理する項目が少なく、外観の加工に関して無限の可能性を秘めているため、このシェーダ パッケージは非常に魅力的なものになりました。

レイヤ シェーダは、mental ray シェーディングで利用可能な、非常に包括的なライブラリで、ハードとソフト、有機サーフェスと無機サーフェス プロパティの両方を簡単にサポートします。組み合わせは無限大です。

さっそく作ってみましょう。