| On this page |
光が半透明の物体と相互作用すると、サブサーフェススキャタリング(SSS)と呼ばれる現象が観測されます。 サブサーフェススキャタリングでは、光は媒質内で何度も反射し、時には吸収されたり、時には表面から出て行ったりします。 光線の出口は、その入口と同じとは限りません。 3Dコンピュータグラフィックスにおいて、サブサーフェススキャタリングは極めて重要です。 この効果がないと、半透明のマテリアルは粘土やゴムのような外観になりがちです。
現実世界でサブサーフェススキャタリングを確認するには、強い光源に手を当ててみてください。 指の周囲や、場合によっては静脈などの構造が光って見えるはずです。 指の内側は組織が厚く光を吸収するため、より暗く見えます。 サブサーフェススキャタリングが見られる他の代表的なマテリアルや物体としては、ワックス、プラスチック、牛乳、フルーツジュース、大理石、葉、キノコなどが挙げられますが、特定の布地にも見られます。
透過性のあるマテリアルは、SSSマテリアルとは根本的に異なります。 ガラスや水のようなマテリアルでは、表面での相互作用を除き、光は媒体を妨げられることなく通過します。 一方、SSSでは光が(ボリュームのような)媒体内部で散乱し、ランダムに方向を変えます。
KarmaでのSSS ¶
HoudiniのKarma CPUおよびKarma XPUレンダリングエンジンは、サブサーフェススキャタリングのレンダリングに対応していますが、オブジェクトに適切なシェーダを設定する必要があります。
MaterialXでは、MaterialX Standard Surface VOPと
MaterialX Open PBR Surface VOPの2つの選択肢があります。
Karma CPUでレンダリングする場合は、VEXベースのシェーダも利用可能です。
Tip
Karma CPUでは、標準のサーフェスシェーダやPBR “uber(万能)”シェーダを使用する代わりに、MaterialX Subsurface BSDF VOPを使用して、SSSコンポーネントを備えた独自のカスタムシェーダを構築することが可能です。
Random Walk ¶
SSSに関連して頻繁に見かける用語の一つに、 Random Walk があります。 この手法では、オブジェクトのボリューム内を光線がランダムに辿る経路をトレースします。 このアルゴリズムは、表面ベースの近似を行なうのではなく、メッシュ内部で光がどのように散乱するかをシミュレーションします。 その結果、表面の細かいディテールを維持しつつ、鋭い曲率を持つ薄いオブジェクトを正確に表現することができます。
この手法の欠点は、確率的処理( モンテカルロ法 )であるため、ある程度のノイズが生じることです。 つまり、Karmaではより高いサンプリング数や品質設定が必要になる場合があります。
パラメータ ¶
Note
MtlX Standard SurfaceシェーダとOpenPBR Surfaceシェーダのパラメータ名は若干異なりますが、機能は同じです。
Tip
SSSパラメータの調整には、写真資料を参照することを推奨します。
Subsurface ¶
このパラメータは、完全ディフューズ反射(0)と完全サブサーフェススキャタリング(1)をブレンドします。
尚、MtlX Standard SurfaceシェーダまたはOpenPBR Surfaceシェーダを使用している場合、 Metalness や Transmission が100%に設定されていると、それらのコンポーネントがディフューズコンポーネントおよびSSSコンポーネントに取って代わるため、SSSの効果が見えなくなります。
左側のPigHeadは完全なディフューズ反射です。
Subsurface 値は、0、0.5、1です。
Color ¶
サブサーフェススキャタリング効果の目標の出力カラーを定義することができます。 例えば、緑を選択した場合、マテリアルは入射光のスペクトル中の青と赤の部分を主に吸収します。 緑の部分はオブジェクトを通過し、最終的に目に見えるカラーを形成します。
下図のPigHeadは、サブサーフェス特性が同じで、カラーのみが異なります。
Radius ¶
Scale で乗算される Radius は、各カラーチャンネルにおいて、光線がオブジェクト内部で散乱される前にオブジェクト内を移動できる平均距離を意味します。
これは、
Mean Free Path(平均自由行程)
として知られるマテリアル固有の値です。
Radius はRGBスペクトルにおける光線の散乱方法を制御するため、これらの値はマテリアル全体のカラーにも影響を与えます。
ただし、最終カラー効果は、調整された Scale の値、および、オブジェクトのサイズや厚さに強く依存します。
0(黒)に設定すると、散乱は一切発生しません。
値が小さいほど光は早く散乱され、より不透明な外観になります。
値が大きいほど、より高い半透明感が得られます。
Scale で乗算される Radius は、シーン単位で測定される物理パラメータです。 MaterialXでは、RGBスペクトルのコンポーネント毎に光が伝播する距離を定義することで、より複雑な散乱効果を得ることができます。 数値を入力する必要はなく、関連するカラーフィールドを使用することができます。 このカラーのことを Mean Free Path Color(平均自由行程カラー) と言います。 下図のドットは、画像に使用された Radius カラーを示してします。
Tip
Radius に直接最終値を設定し、 Scale を1のままにしておくことも可能です。
Radius と Scale の区別は、あくまで利便性を考慮したものに過ぎないです。
Scale ¶
これは、すべての Radius 値に対するグローバル乗数です。 オブジェクトのサイズは、その外観に影響を与えます。 SSS特性が同じ場合、小さなオブジェクトは巨大なオブジェクトよりも光に対して透明度が高くなります。
シーンスケールが1mで、各方向のサイズが0.1m(=10cm)の大理石のブロックがあると仮定しましょう。
シェーダのデフォルトの Scale 値が1で、 Radius が純粋な白の場合、平均的な光線は散乱されるまで1m進むことができます。
正しい結果を得るためには、 Scale を大理石のブロックのサイズに合わせて設定し、その寸法を考慮する必要があります。
光線を散乱させるためには、 Scale を例えば0.005のように小さくする必要があります。
すべての Radius 値を1に設定すると、光線は0.005m(=5mm)進んだ後に散乱します。
ただし、大まかな目安として、 Scale の値が高いほど、より柔らかく半透明な見た目になると言えます。
また、(誇張された)例も見てみましょう。
ここでもシーンスケールは1mと仮定します。
サイズが2mのオブジェクトを17cmに縮小する必要があると想像してください。
この変換の倍率は17 cm / 200 cm = 0.085となります。
ここで、元のオブジェクトに対して、サブサーフェスの Scale が0.35であると仮定します。
補正後の Scale 値を求めるには、両方の値を掛け合わせます:
-
0.35 * 0.085 = 0.02975
下図の Scale 値は、0.01、0.1、1です。
Anisotropy ¶
バックライトがあって、光がオブジェクトをより強く透過するようにさせたい場合は、 Anisotropy(異方性) を上げてプラスの値を使用する必要があります。 この効果のことを Forward Scattering(前方散乱) と言います。 マイナスの値を使用すると、 Backward Scattering(後方散乱) となり、オブジェクトの半透明感が弱まります。 Anisotropy は、エネルギーを様々な方向に分散させます。
Note
技術に詳しいユーザ向け: Anisotropy は、標準の Henyey-Greenstein位相関数 用のパラメータです。
0の値は、光が均一に散乱される Isotropic Scattering(等方散乱) を意味します。
範囲は-1から1ですが、最小値や最大値の使用は推奨しません。
ほとんどの場合、値は-0.5から0.5の範囲になります。
この説明のために、以下のオブジェクトの Anisotropy の値は-0.5、0 、0.5となっています。
この効果を引き出すために、PigHeadの後ろに強力なエリアライトを配置しています。
マップ ¶
オブジェクト全体に有効な固定値の代わりに、可変値を持つテクスチャマップをシェーダの Subsurface タブのパラメータに接続することもできます:
-
純粋な黒は0の値を意味します。
-
純粋な白は1の値1を意味します。
Note
結果の値が1未満の場合、その領域では再びディフューズ反射が見られることになります。 下図では、グレースケールマップがシェーダの Subsurface パラメータに接続されています。 グレースケールマップの淡い色調がHoudiniロゴの背後にハロー効果を生み出しています。 シェーダの Base のカラーを変更すると、マップの白以外の領域からディフューズ反射が透けて見えます。 また、このグレースケールマップをディフューズ分布の“マスク”と見なすこともできます。
AOVとLPE ¶
Light Path Expressionを介してオブジェクトのSSSライティング寄与度を抽出し、それを別のAOVに書き出すことができます。
Karma Render Settings LOPの Image Output ▸ AOVs (Render Vars) タブには、個別の SSS セクションがあります。
これを展開して、 BSDF Labelled 'sss' を有効にしてください。
サンプルマテリアル ¶
以下のサンプルマテリアルとそれらのパラメータはあくまで 提案 であり、万能の答えではありません。 特にSSSに関しては、主観的な認識が重要な役割を果たします。 オレンジジュースが良い例です。 ある人はそれを鮮やかな黄色い液体だと思う一方で、別の人は赤の割合が多い濃いオレンジ色と認識するからです。 人間の肌についても同様で、肌の色調の数だけ意見が存在します。 シーンの照明の位置、色、強度も最終的な結果に影響を与えるため、リアルに見えるようにマテリアルを微調整する必要が出てくる場合があります。
ワックス ¶
キャンドルワックスは、サブサーフェススキャタリング関連で最も頻繁に言及されるマテリアルの一つです。 ワックスの最終的な外観は、ワックスの種類によって異なります。 蜜蝋(みつろう)や大豆蝋は、ベルベットのような質感を持ち、くすんだ外観になる傾向があります。 天然の蜜蝋には花粉などの不純物が含まれており、それが温かみのある黄色や淡いオレンジ色のトーンを生み出します。
一方、パラフィンワックスは原油から作られており、光沢のある見た目になります。 ステアリンキャンドルは、ステアリン酸とパルミチン酸の混合物です。 この種類のワックスは、表面の光沢が控えめで、乳白色の外観を呈することがあります。 純粋なパラフィンやステアリンは白い物質ですが、任意の色に染色することが可能です。
キャンドルのマテリアルは、SSS特性にも影響を与えます。 これは、ワックスの種類によって密度が異なるためです。 その違いは些細に見えるかもしれませんが、シェーダの Scale パラメータに影響を与える可能性があります。 密度は以下の通りです:
-
蜜蝋:約0.96kg/m^3
-
ステアリンワックス:約0.94kg/m^3
-
パラフィンワックス:約0.90kg/m^3
このサンプルマテリアルのキャンドルの半径は0.04m(=4cm)、高さは約0.15m(=15cm)で、ステアリン製です。
さらに、Area Light LOPの Type を Sphere に設定し、 Color Temperature を
2000 に設定してキャンドルの炎を再現しています。
以下のテーブルには、シェーダの Subsurface パラメータの値と説明を記載しています。
Note
キャンドルの光沢を抑えたいのであれば、 Specular タブの値を変更しても良いでしょう(例えば、スペキュラの Roughness を0.25に設定するなど)。
| パラメータ | 値 | 説明 |
|---|---|---|
| Subsurface |
1
|
値が1の場合、ディフューズ反射を伴わない完全なサブサーフェススキャタリングとなります。キャンドルの色は、 Color パラメータと Radius パラメータのみで決まります。
|
| Color |
0.5, 0, 0
|
これはSSS効果の主色であり、キャンドルに深みのある赤みを帯びた色合いを与えます。 |
| Radius |
1, 0.3, 0.2
|
ここでは、RGBスペクトルの各コンポーネントがオブジェクトをどの程度深く透過できるかを指定します。この値によって、キャンドルの上部付近のより半透明な部分に微妙な肌色が生まれます。 |
| Scale |
0.02
|
この値は、3つの Radius 値に掛け合わされ、マテリアルの実際の見た目を決定します。また、キャンドルの寸法も最終的な Scale に影響します。設定値を高くすると、密度が低く、“輝き”の強い外観が得られます。 |
| Anisotropy |
0.35
|
ワックスは前方へ散乱する傾向があるため、この値を設定することで、よりリアルな外観が得られます。 |
以下の一連の画像は、 Subsurface 値をそのままに、キャンドルを大きくした場合に外観がどのように変化するかを示しています。
上記の画像が元のキャンドルです。
以下の3枚の画像では、 Global Scale のトランスフォーム値として、0.5、1、2を使用しています。
オレンジジュース ¶
オレンジジュースは、水、ブドウ糖や果糖などの糖類、クエン酸などの有機酸、その他の化合物が複雑に混ざり合った懸濁液です。 また、オレンジジュースには果肉が様々な量で含まれています。 オレンジジュースには“これ”といった決まった種類がないため、色やSSS値に関してある程度の自由度があります。
グラスの高さは0.13m(=13cm)、飲み口の半径は0.043m(=4.3cm)です。
グラスの中には、ジュースを表現したソリッドジオメトリがあります。
ジュース自体もわずかに透明な特性を持っており、シェーダの Transmission パラメータや色を調整して様々な表現が可能です。
Transmission に関しては、0.1付近の値を試してみてください。
前回と同様、この画像で使用したSSS値を以下のテーブルに記載しています。
| パラメータ | 値 | 説明 |
|---|---|---|
| Subsurface |
1
|
オレンジジュースにはディフューズ反射が見られないため、サブサーフェススキャタリングのみを発生させます。 |
| Color |
1, 0.27, 0
|
言うまでもなく、これはオレンジ色またはオレンジがかった黄色のトーンにしてください。カラーフィールドを使用して適切な色を選択することができます。 |
| Radius |
1, 0.9, 0
|
赤と青の半径値は、スペクトルのこの部分の光線が最も長く進むことを示しています。ただし、青の部分は完全に吸収されます。これらの値によって、流体の半透明な部分に見られる鮮やかな黄色調が生まれます。 |
| Scale |
0.013
|
色々な値を試して、自分だけのオレンジジュースを作り出してみてください! |
| Anisotropy |
-0.5
|
この値を設定すると、光線がより長い距離を伝播しなければならない流体の内部が暗くなります。“ハロー”効果を強調するために、後方散乱(<0)が選択されています。前方散乱(>0)の場合、流体はより明るくなり、黄色の割合が多くなります。
|
牛乳 ¶
牛乳のサンプルでは、オレンジジュースのシーンと同じセットアップを使用しています。 シェーディングに関しては、通常、全乳と低脂肪乳を区別する必要があります。 全乳は脂肪分が多いため、わずかに黄色みを帯びています。 この色合いはあまり目立ちすぎず、半透明な部分でのみ見受けられるようにするべきです。
Scale 値を高く設定しすぎると、牛乳が水に溶かしたデンプンのように薄く水っぽい見た目になってしまうことがよくあります。
この値を非常に小さくすると、流体はよりクリーミーで重厚な見た目にすることができます。
左の画像では Scale が0.01に設定されており、右の画像では0.0005に設定されています。
ワックスと同様に、牛乳も強い前方散乱を示します。
ただし、 Anisotropy を0に設定しても、それによって望ましい見た目が得られるのであれば問題ありません。
また、シェーダの Specular タブでの調整も検討してください。
以下のテーブルには、レンダリング結果に示されている全乳の値を記載しています。
| パラメータ | 値 | 説明 |
|---|---|---|
| Subsurface |
1
|
牛乳にはディフューズ反射が見られないため、サブサーフェススキャタリングのみを発生させます。 |
| Color |
1, 1, 0.88
|
これは、全乳であることを示すために、わずかに黄色がかった色調に設定されています。 |
| Radius |
0.9, 0.75, 0.5
|
この値の組み合わせによって、液体の透過部分にも黄色がかった色合いが生まれます。 |
| Scale |
0.001
|
この値を設定すると、光線が表面の真下で散乱される牛乳特有の“重厚な”外観が生まれます。流体の本体は単色のままです。 |
| Anisotropy |
0.1
|
よりリアルな外観にするには、一定量の前方散乱を追加すると良いでしょう。 |
キノコ ¶
このサンプルマテリアルにあるように、多くのキノコもSSS特性を示します。
最も長いキノコの高さは0.1m(=10cm)で、シェーダの Scale パラメータの参考値として用意しています。
キノコの傘はわずかに半透明ですが、ある程度のディフューズ反射もあります。
そのため、 Subsurface パラメータの値は、1よりも小さく設定する必要があります。
Color および Radius の設定は、キノコ自体の色合いに大きく依存します。
このシーンでは、茶色や濃いオレンジ色の色調が主となっています。
このガイドの他のシーンとは対照的に、キノコはSpot Light LOPで照らされており、その Color Temperature は
5500ケルビンに設定されています。
カメラ視点では、このスポットライトはオブジェクトの左側に配置されています。
オブジェクトの Scale パラメータの選択は、 Subsurface の値が低いため、間違いなく最も難しい部分です。 強い照明の下では、傘の縁付近の薄い部分が半透明に見え、典型的な“ハロー”効果が現れることがよくあります。 Anisotropy をプラスの値に設定することで、この効果を強調することができます。
| パラメータ | 値 | 説明 |
|---|---|---|
| Subsurface |
0.45
|
この値を大きくすると、ディフューズ反射が強くなります。 |
| Color |
0.1, 0.05, 0
|
濃い茶色は、キノコの色によく合います。 |
| Radius |
0.15, 0.09, 0
|
Radius の色も茶系ですが、黄色の割合がわずかに多くなっています。青色の部分(0)は完全に吸収されます。
|
| Scale |
0.007
|
この値を設定すると、傘の縁の半透明感が強調されます。 |
| Anisotropy |
0.1
|
“ハロー”効果をより際立たせるには、前方散乱を追加すると良いでしょう。 |
皮膚 ¶
皮膚シェーダは、特に表皮などの異なる皮膚層を考慮したい場合、非常に複雑になることがあります。 MaterialXのサーフェスシェーダは、他のマテリアルシステムで見られるようなShallow(浅層)、Medium(中層)、Deep(深層)といった層には対応していません。
通常、皮膚マテリアルでは、RGBスペクトルの緑や青に比べて赤の光が皮膚の最も奥深くまで浸透するため、赤の Radius 値が高くなります。
Radius 値の組み合わせの一例として、1, 0.15, 0.1が挙げられます。
また、血液循環、体毛、肌質(乾燥肌、脂性肌、荒れた肌)、肌の凹凸、毛穴、そばかすなど、他の特徴も考慮することができます。 皮膚の大部分は細い毛で覆われており、産毛のような効果を生み出します。 皮膚の厚さによって、体の部位ごとにSSSの特性は異なります。 例えば、頭部を見ると、頬の皮膚は通常、額の皮膚よりも厚くなっています。マップでは、こうした違いを考慮します。
ディフューズ反射やスペキュラ反射といった他のローブも、最終的な見た目に大きな影響を与えます。
薄壁SSS ¶
葉っぱのような薄壁オブジェクトもSSSの特性を示します。 この種のジオメトリをレンダリングするには、特定のモードが必要です。 このモードは、 Radius 、 Scale 、 Anisotropy が考慮されない限定されたサブサーフェススキャタリングパラメータセットを使用します:
-
Subsurface を
0より大きい値に設定します。 -
Color を選択するか、または、マップを接続します。
-
MtlX Standard SurfaceシェーダまたはMtlX OpenPBRシェーダで、 Geometry セクションを展開して、 Thin Walled モードを有効にします。
Tip
薄壁SSSでは、 Subsurface 値を0.5から始めることを推奨します。
Standard SurfaceシェーダおよびOpenPBRシェーダの仕様では、薄壁SSSは完全な前方散乱となります。
したがって、1に設定すると、光を受けるサーフェスはシーン内に光を反射しなくなります。
下図は、 Thin Walled をオフ(左)およびオン(右)にした状態の薄いサーフェスを示しています。 左側では、球体のぼやけた“影”が見えます。
SSSトレースセット ¶
SSSマテリアルが適用されたオブジェクトを複数のオブジェクトやサブセットに分割すると、シーンをレンダリングした際に不連続性が生じます。 この問題を解決するには、トレースセット文字列アトリビュートを使用してオブジェクトを“結合”すると良いでしょう。 そうすることで、Karmaは同じトレースセットを持つすべてのサブセットを1つのオブジェクトとして扱います。
トレースセットを作成するには、以下の手順に従ってください:
-
ネットワークに
Render Geometry Settings LOPを追加します。
-
トレースセットを適用したいプリミティブのパスを、そのRender Geometry Settings LOPの Primitive パラメータに設定します(
/World/box/*のようなワイルドカードを入力することができます)。 -
Karmaタブの Shading セクションを展開して、
SSS Tracesetを有効にします。 -
その空っぽのフィールドにトレースセット名(例えば、
sssbox)を入力します。 -
シーンをレンダリングします。SSSトレースセットは、Karma CPUおよびKarma XPUの 両方 で動作します。
下図の左側は、トレースセットが適用されていないボックスで、上記の説明のとおり不連続性が確認できます。 右側は、トレースセットが適用された同じオブジェクトが確認できます。