Blenderであそんでみた

3D-CGソフトBlenderの小技や豆知識など。

プリンシプルBSDFでサブサーフェスの使い方/前編

f:id:hainarashi:20201018214045j:plain

※記事製作時のバージョン:Blender2.90.1

 

プリンシプルBSDFで、いろいろな質感表現の方法を探っていくシリーズ。
第7回はサブサーフェススキャッタリング(略称 "SSS")の使い方/前編です。

今回の記事は長いので、前・後編に分けています。
前編はSSSの基礎知識とパラメーターについて、
後編はSSSの設定方法など、具体的な使い方について説明します。

 

後編はこちらのリンクからどうぞ。

hainarashi.hatenablog.com

 

SSSは、使えるようになると表現の幅が大きく広がる技法です。
一方、使い方が非常に分かりづらいため、ついつい敬遠してしまう、もったいない存在でもあります。
この記事ではSSSが使いづらい原因と、使いやすくするために個人的に編み出した方法を、詳しく解説します。
この記事を元に、SSSがもっと活用されるようになると嬉しいです。

 

サブサーフェススキャッタリング

SSSは「光を通すけれども、透き通ってはいない物質」を表現する仕組みです。
人の肌、草木の葉、ろうそく、シリコン、牛乳、クリーム、大理石などに使います。

f:id:hainarashi:20201021120141j:plain

サブサーフェススキャッタリング

 

このような物質に入った光は、内部で色々な方向に散乱し、入ったところとは違う場所から再び外に出てきます。
その結果

  • 物体の陰影の中まで光が届く
  • 薄い部分は光が透けて明るく見える

となり、柔らかい質感になります。

この「物質内部での散乱」を
サブサーフェススキャッタリング
(Subsurface Scattering:表面下散乱)
と言います。

この記事では略称で "SSS" と表記します。

 

プリンシプルBSDFのSSS表現のパラメーターは

の3つがあります。

 

サブサーフェス

表面の散乱(ディフューズ)とSSSのミックス度合いです。
0.0でディフューズのみ。
1.0でSSSのみになります。

f:id:hainarashi:20201006152926j:plain

サブサーフェス

 

通常、パラメーターは1つにつき1つの機能(役割)を持ちますが、サブサーフェスには

の2つの役割があります。

それぞれの具体的な働きは、サブサーフェス範囲サブサーフェスカラーの項目で説明します。

 

パラメーターの優先順位

サブサーフェスよりも、メタリックと伝播の方が優先されます。
メタリックと伝播のどちらかが1.0の場合、サブサーフェスは無効になります。

f:id:hainarashi:20201021120514j:plain

パラメーターの優先順位

 

ただしCyclesの場合は、影の色にサブサーフェスの影響が出て、おかしな事になります。
メタリックか伝播を使う場合、サブサーフェスは必ず0.0にしておきます。

 

サブサーフェス範囲

表面下で散乱した光がどこまで広がるかの距離です。
この値(0~100)が大きいほど陰影の中に光が届くようになります。

f:id:hainarashi:20201007173600j:plain

サブサーフェス範囲

 

オブジェクトのサイズに対して大きすぎる値にすると見た目が破綻するので、画面で確認しながら程よい値にします。

 

実際にどこまで光が届くかは、サブサーフェスの値との乗算で決まります。
例えば

は同じ結果になります。

f:id:hainarashi:20201021123627j:plain

実際に光の届く範囲

 

この「光の届く範囲」は、ワールドを基準に設定されます。
オブジェクトのスケールを変更しても、それに連動して光の届く範囲を調整してくれるような機能はありません。
そのため実際にマテリアルを設定する際は、先にオブジェクトのサイズを決めてからサブサーフェス範囲を設定します。

f:id:hainarashi:20201009102127j:plain

光の届く範囲はワールド基準

 

サブサーフェス範囲はRGBの各チャンネル毎に設定して、散乱光に色味の変化をつけることができます。
※RGBすべてを同じ値にすると、散乱光は色変化せず、元のカラーのままになります。

f:id:hainarashi:20201009140949j:plain

散乱光の色変化指定

 

やり方としては普通の色設定と同じですが、色設定のRGBが0~1なのに対し、こちらは0~100なので、かなり戸惑います。
色自体はRGBの「比率」で決まるようなのですが・・・正直、狙っては作れません。

設定しやすくする方法はあるので、後で説明します。

 

IOR(屈折率)やメタリックのベースカラーとは異なり、サブサーフェス範囲には「この物質ならばこの値」というような決まりや基準はありません。
画面上の見た目に基づき、感覚と好みで設定します。

 

入力ソケットの特殊な働き 

サブサーフェス範囲の入力ソケットは

パラメーターの元の数値 × ソケットからの入力値

という特殊な働きをします。

f:id:hainarashi:20201027131035j:plain

入力ソケットの特殊な働き

 

これは非常に特殊なケースです。

通常、入力ソケットにノードをつないだ場合、元のデータは無効になり、ソケットから入力されたデータに置き換えられます。

f:id:hainarashi:20201011194534j:plain

通常のノードの働き

 

これはノードツリーの基本中の基本。前提とも言える仕組みです。
私の知る限りの全ノード・全ソケットの中で、サブサーフェス範囲が唯一の例外です。
そのため、つい普通の感覚で「サブサーフェス範囲もノードから散乱光のRGBを操作できるはず」・・・と思ってしまうのですが、これができません。 

f:id:hainarashi:20201021124215j:plain

できるはずのことができない

 

知らないとひたすら混乱しますので、覚えておいてください。

 

この特殊性のため、

  • 散乱光の色味を設定できるのは直接入力だけ。
  • テクスチャなどを使って散乱光の色味を変えることはできない。
    (1つのプリンシプルBSDFで設定できる散乱光の色味は一種類だけ)

という制限が発生します。

 

もうひとつ特殊な点が、サブサーフェス範囲のソケットにはあります。

ソケットの色からすると、これはベクトル用のソケットです。
しかし実際にベクトルノードをつないでも、「XYZの平均値」が単一の値として使われます。
なので値ノードを使った方が扱いが簡単になります。

f:id:hainarashi:20201013154851j:plain

ベクトルノードが単一値として扱われる

 

なぜこんな作りなのか理由も分かりませんが、実際にこういう仕組みである以上「サブサーフェス範囲のソケットはこういうものなのだ」と割りきって使う必要があります。

※サブサーフェス範囲の入力ソケットの特殊性については、マニュアルにも各種解説サイトにも、どこにも説明がありません。私はプログラム内部のことは分からないので、この記事の内容は実際のBlenderの挙動を元に検証しました。

 

サブサーフェスカラー

マニュアルには「表面下散乱のベースカラー」とあります。

実際の働きは

  1. ベースカラーとサブサーフェスカラーを
  2. サブサーフェスの係数でミックスした色(またはテクスチャ)が
  3. 最終的なベースカラーになる

というものです。

f:id:hainarashi:20201009092134j:plain

サブサーフェスカラー

 

ここで行われる処理はただのカラーミックスで、RGBミックスノードで代用しても、全く同じ結果になります。
実際に検証してみると、下図のようになります。

f:id:hainarashi:20201027154928j:plain

f:id:hainarashi:20201027154921j:plain

サブサーフェスカラーの実験

 

他にも色々な実験をして確認しましたが、サブサーフェスカラーの役割は
「最終的なベースカラーを作るための、カラーミックスの片方の色素材
というだけのものです。
SSSの質感(陰影内に届く散乱光)への直接の影響は何もありません。

 

サブサーフェスカラーは、SSSの質感を表現する上で役割を持ちません。
そして、カラーミックスをするだけならRGBミックスの方が便利です。
つまり、サブサーフェスカラーは無くても良いパラメーターという結論になります。

 

なぜ、無くても良いパラメーターがあるのか?
元々はどういう用途や使い方が想定されているのか?
いろいろ気にはなりますが、それはともかく。

 

SSSが使いづらい原因と対処方法

SSSはパラメーターに構造的な問題があり、はっきり言って使いづらいです。
使いづらさの原因と、ある程度使いやすくするための対処方法を解説します。

 

【問題その1】

サブサーフェス

の2つの役割を持つ。

 

この2つが連動しているために、あちら立てればこちらが立たずで「カラーのミックス度合いを良い感じにしたら、サブサーフェス範囲の度合いが今イチになった」という具合になります。

全体的な調整が非常に面倒になる原因です。

 

<対処方法>

サブサーフェスカラーにベースカラーと同じ色(またはテクスチャ)をつなぎます。
これでサブサーフェスカラーは実質的に無効化されるので、
サブサーフェスを「サブサーフェス範囲の乗数」の役割に絞り、SSSの強さのパラメーターにすることができます。

前項で説明したとおり、サブサーフェスカラーは無くても良いパラメーターなので、無効化しても問題はありません。

f:id:hainarashi:20201009150829j:plain

サブサーフェスカラーを実質的に無効化する

 

【問題その2】

サブサーフェス範囲が

  • 散乱光の色味変化
  • 散乱光の届く範囲

の2つをまとめて設定する仕組みになっている。

 

この2つが別々に設定する仕組みになっていれば何の問題も無いのですが。
実際にはひとまとめになってしまっているので、次のような問題が起きます。

  • 色を直感的に設定できない。
  • 通常の色設定は0~1だが、ここで使う値は0~100なので感覚が狂う。
  • 「色味設定」と「光の届く範囲設定」がひとまとめになっているので、「色味はこのままで光の届く範囲を変えたい」というような調整ができない。

 

<対処方法>

  • サブサーフェス範囲は入力値を0~1に限定して、色設定だけをする。
  • 散乱光の届く範囲は、値ノードをつないで設定する。入力値は 0~100。

f:id:hainarashi:20201027144917j:plain

色味と光の届く範囲を別々に設定する

 

これで色味と光の届く範囲を別々に設定できるようになります。

  • カラーピッカーが表示されるわけではないので、色設定が直感的にできない
  • RGB値による色設定しかできない(HSVも16進数も使えない)

という問題は残りますが、現状ではこれがベストとなります。

 

 

以上、サブサーフェスの使い方/前編『SSSの基礎知識とパラメーターについて』でした。
後編『SSSの設定方法など、具体的な使い方について』に続きます。

 

※添削・構成アドバイス:相方

 

twitter

灰ならし (@hainarashi) | Twitter

 

参考サイト 

Subsurface - Arnold for Maya User Guide - Arnold Renderer