Blenderであそんでみた

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

プリンシプルBSDFでいろいろな質感の作り方(9) ニス・ワックス塗り

f:id:hainarashi:20210108212035j:plain

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

 

プリンシプルBSDFで、いろいろな質感表現の方法を探っていくシリーズ。
第9回はニス・ワックス塗りの作り方です。

それ以外の用途としては、

  • リンゴなど果物の表面(天然ワックス)
  • 光沢のあるチョコレート(光沢剤)
  • タルトやケーキ、フルーツなどのゼリーコーティング(ナパージュ)
  • 陶器の釉薬

などの表現にも使えます。

 

これらはすべて、次のような状態です。

  • 物体の表面に薄い透過層が作られる
  • その透過層が少しだけ光を反射する

こういう表現はクリアコートで作ります。

 

クリアコート

クリアコートは、スペキュラーとは別に設定する、追加の反射です。
スペキュラーに比べてかなり反射率の低い、ほのかな反射・光沢になります。

f:id:hainarashi:20201229193034j:plain

クリアコート

 

f:id:hainarashi:20201228222344j:plain

スペキュラーとの反射具合の比較

 

「反射・光沢」という意味ではスペキュラーと同じ働きですが、次のように役割が異なります。

  • スペキュラー:下地の反射・光沢
  • クリアコート:ニスやワックスなどによる、下地の上に追加する弱い反射・光沢

実際の物質は2~5%の反射率(0.25~0.625のスペキュラー)を持つので、「スペキュラーを0にして、代わりにクリアコートだけで光沢を付ける」という使い方はNGです。

スペキュラーについての詳細は、こちらの記事を参照してください。

hainarashi.hatenablog.com

 

クリアコートの粗さ

クリアコートの光沢の鮮明さです。
下地部分の粗さ(ラフネス)とは別に設定できます。

f:id:hainarashi:20201229193316j:plain

クリアコートの粗さ

0.0~0.1:塗りたてのニス・ワックス
0.2~0.4:くすんできたニス・ワックス
といったイメージです。

 

クリアコート法線

クリアコートのノーマルです。
通常は下地部分と同じノーマルを設定します。

f:id:hainarashi:20210110150505j:plain

クリアコート法線

 

下の画像のように下地だけノーマルを設定すると、凹凸のある下地をコーティングで厚く覆ったような表現ができます。
ナパージュや釉薬などに応用できます。

f:id:hainarashi:20210110150458j:plain

下地とクリアコートのノーマルは別々に設定できる

 

下地の設定について

クリアコートは、他のパラメーターによる制限を受けません。
下地の質感を金属・非金属・ガラス・SSS、その他何に設定しても、クリアコートを使うことができます。
※現実の物質で、下地がどんな材質であってもニスやワックスが塗れるのと同じ。

f:id:hainarashi:20210105130658j:plain

いろいろな質感でクリアコート

 

クリアコートを使う時は、下地の状態を想定して粗さ(ラフネス)を設定します。
「荒れた下地にニス・ワックスの光沢だけが乗っている」状態を表現する場合は、粗さを上げて下地の反射・光沢を消します。

f:id:hainarashi:20201230213532j:plain

荒れた下地にクリアコート

 

「磨き上げた下地に、保護剤としてニス・ワックスを塗る」という状態の場合は、粗さを低く設定します。
微妙な差ですが、クリアコートを追加した分、ちゃんと見た目に違いが出ます。

f:id:hainarashi:20201230215330j:plain

磨いた下地にクリアコート

 

 

以上、ニス・ワックス塗りの作り方でした。

 

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

 

GIMPのGIFアニメ作成機能を、もっと使いやすくする方法

f:id:hainarashi:20201224173234g:plain

今回はBlenderではなく、GIMPの話です。

GIMPのGIFアニメ作成機能における最大の弱点、
「枚数の多い画像に、個別の表示時間設定をするのが実質無理
という問題の解決方法を紹介します。

※記事製作時のバージョン:GIMP2.10

 

何が問題なのか?

GIFアニメの基本的な仕組みは、「フレーム毎に表示時間を指定できるコマ送り」です。

1枚1枚の画像をゆっくり切り替えるとスライドショーに、
たくさんの画像を素早く次々に切り替えるとアニメーションになります。

f:id:hainarashi:20201213180307g:plain

スライドショー(3.5秒/フレーム)

 

f:id:hainarashi:20201213214107g:plain

アニメーション(0.04秒/フレーム)

 

GIMPでの表示時間の設定方法は

  • 一括設定
  • 個別設定

の2種類があります。

一括設定には何の不便も無いのですが、個別設定の方に欠点があります。

 

下のGIFアニメは、最初の1フレームを1秒表示して間を取り、残りは0.04秒/フレームでアニメーションさせています。
このように、1フレームでも他と違う時間を指定する場合は、一括設定が使えません。
なので、個別設定で全てのフレームの時間を指定する必要があります。

f:id:hainarashi:20201111221433g:plain

最初に間を取るアニメーション

 

個別設定は、各フレームの表示時間をレイヤー名で指定します。
レイヤー名の変更は手作業です。

f:id:hainarashi:20201213223810p:plain

個別設定のフレーム表示時間指定

 

Blenderなどでアニメーションを作成すると、数秒でも軽く100フレームは超えます。
100枚以上のレイヤー名を手作業で変更・・・
やってやれない事はない、けど、実質無理。
というわけです。

 

解決方法

レイヤー名を一括リネームできるスクリプトを導入します。

「全てのレイヤーの表示時間を設定する」と言っても、基本は同じ値に変えるだけ(24fpsなら42ms、30fpsなら33ms、というように)。
違う時間を設定するのは、普通ならば1~数枚程度です。

スクリプトで基本の表示時間に一括リネームして、1~数枚を手作業で変更。
これで断然使いやすくなります。

 

スクリプトの導入手順

1. こちらのリンク先からスクリプトをダウンロード。 

GIMPの全レイヤーを連番リネーム、または連番テキストを描画するスクリプト - mieki256 wiki

f:id:hainarashi:20201214212045p:plain

スクリプト入手方法

 

2. ダウンロードしたファイル名の
 「all-layers-process-serial-number_m256.scm.txt」を
 「all-layers-process-serial-number_m256.scm」にリネーム。
 ※末尾の「.txt」を削除。

 

3. GIMPのメニュー「編集 > 設定 > フォルダー > スクリプト」からスクリプト用フォルダーを開き、 リネームしたファイルを移動。

f:id:hainarashi:20201222075726j:plain

スクリプト用フォルダー

 

4. GIMPを再起動。

 「レイヤー」メニューの中に「全レイヤーに連番関連処理」の項目が追加されていればOKです。

f:id:hainarashi:20201214211351p:plain

追加メニュー

 

GIFアニメの作成手順

ここでは、連番画像をGIFアニメにする手順で説明します。
 

1. ファイル > レイヤーとして開く > アニメーションにする連番画像を全て選択 > 開く

 連番画像がレイヤーとして読み込まれます。

f:id:hainarashi:20201215213953j:plain

連番画像をレイヤーとして開く

 

f:id:hainarashi:20201223120116j:plain

読み込まれた連番画像

 

2. フィルター > アニメーション > GIF用最適化

 連番画像がGIFアニメ用に最適化され、別ウィンドウで開きます。

f:id:hainarashi:20201215215226j:plain

GIF用最適化

 

f:id:hainarashi:20201216212705p:plain

GIF用最適化後のレイヤー

 

3. レイヤー > 全レイヤーに連番関連処理

  • 開始番号 > 1
  • 付加文字列(後) > (**ms)(combine) ** に設定したい時間を入力。

 レイヤー名が一括リネームされます。

f:id:hainarashi:20201216212100j:plain

レイヤー名一括リネーム

 

f:id:hainarashi:20201216213112p:plain

一括リネーム後のレイヤー名

 

4. 違う表示時間にするフレームのレイヤー名を、手動で変更します。

f:id:hainarashi:20201217094717j:plain

レイヤー名を手動で変更

 

5. ファイル > 名前を付けてエクスポート > ファイル名の拡張子を ".gif" にしてエクスポート

f:id:hainarashi:20201223120129j:plain

エクスポート

 

6. GIFのオプション設定で、「アニメーションとしてエクスポート」をONにする > エクスポート

f:id:hainarashi:20201217174030p:plain

GIFのオプション

 

以上で完了です。

 

※GIFアニメをエクスポートする時、次の2つが自動処理されます。

  • フレーム表示時間の一の桁が四捨五入される。
  • 先頭フレームのレイヤー名から "(combine)" の文字列が削除される。

f:id:hainarashi:20201221170645p:plain

エクスポート時の自動処理

 

補足

一括設定の方法

フレーム表示時間を一括設定する場合は、アニメーションGIFのオプションで次の2つを設定します。

  • 「指定しない場合のディレイ」に設定したい時間を入力
  • 「全フレームのディレイにこの値を使用」をON

一括設定は個別設定より優先され、全フレームの表示時間が「指定しない場合のディレイ」の数値で上書きされます。

f:id:hainarashi:20201221211955p:plain

一括設定

 

なお、「ディレイ」とはこの記事で言う「フレームの表示時間」のことです。
ソフトやwebサービスによって「ディレイ」「待ち時間」「ウェイト」「持続時間」「点滅間隔」「アニメーション間隔」・・・などなど、様々な名前で表記されます。

 

ファイルサイズの調整

フレーム表示時間とは別の話ですが、GIFのファイルサイズを小さくしたい場合は、画像を縮小してエクスポートし直します。

例えば50%に縮小すると、ファイルサイズは約1/4になります。
その分画質も悪くなるので要注意です。

f:id:hainarashi:20201221212458j:plain

画像の拡大・縮小

 

 

以上、「GIMPのGIFアニメ作成機能を、もっと使いやすくする方法」でした。 

 

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

 

参考サイト

GIMPで連番画像からGIFアニメを作成する方法は、こちらの記事を参考にしました。
GIFアニメの作成手順全般が詳しくまとめられています。

nomoreretake.net

 

Blenderで流体シミュレーション/液体(2) 「水の塊をばしゃんと落とす」解説編

f:id:hainarashi:20201124150718j:plain

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

 

簡単な見本を作りながら、流体シミュレーションの使い方を紹介していくシリーズ。
第2回は、「水の塊をばしゃんと落とす」の解説編です。

 
前回の実践編では、実際にシーンを作成しました。
この解説編では、使用した機能やパラメーターについて詳しく説明します。

 

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

hainarashi.hatenablog.com

 

ドメイン(Domain)

ドメインは流体シミュレーションの計算領域です。
液体も気体も、ドメインの範囲内だけでシミュレートされます。

f:id:hainarashi:20201124173009j:plain

ドメイン

 

ドメインは1つのシーンに複数配置できます。
その場合、シミュレーションの設定は各ドメイン毎に行います。

f:id:hainarashi:20201112210020j:plain

ドメインの複数配置

 

異なるドメインのシミュレーションは、お互いに影響を与えません。
「水をかけて炎を消す」といったシーンを作る場合は、そういう結果になるように、それぞれのシミュレーションのタイミングを手動で調整する必要があります。

f:id:hainarashi:20201112213259j:plain

ドメインのシミュレーション

 

Resolution Divisions(解像度)

ドメイン空間の分割数です。

Mantaflowの流体シミュレーションは

  1. ドメインの空間を、格子状の「ボクセル」と呼ばれる単位に分割する。
  2. ボクセルの1つ1つが「流体の有無」と「流体の動きの向きと力」のデータを持つ。
  3. フレームの進行に従って、ボクセル間の相互作用の計算を積み重ねる。

という仕組みで行われます。
※ボクセルと併用してパーティクルも使われますが、ここでは簡単な説明に留めます。

Resolution Divisionsの値が大きいほどドメインが細かく分割され、流体の形と動きがきめ細かく、リアルになります。

同時に、シミュレーションの計算時間とキャッシュ(※)サイズが大きくなるので、

  • 求める流体の品質
  • 使える時間とハードディスク容量

のバランスを考えて設定します。 

※キャッシュ:シミュレーションの計算結果データ。blendファイルとは別に保存される。

f:id:hainarashi:20201113181114g:plain

Resolution Divisions 比較

 

※高画質版はこちらのリンクからどうぞ。

#Blender 【講座の見本】流体シミュレーション解像度の比較 - 灰ならしのうごイラ - pixiv

 

分割されたボクセルのサイズは、ドメインの下の隅に表示されます。

f:id:hainarashi:20201206120126j:plain

ボクセルサイズ

 

なお、上の比較動画を見ると、最初に落下する液体の塊はどれも同じ大きさですが、最後に下に溜まる液体の量には差があります。
これはResolution Divisionsの値が大きいほど、最初に発生する液体パーティクルの量が多くなるためです。
ばしゃんと跳ねた後はパーティクルが分散するので、パーティクルの量に応じて液体の量が増えます。
現実の液体ではあり得ない現象ですが、シミュレーションの方式によってはこういう事もあります。

 

タイプ

シミュレーションの実行方法です。

  • リピート
  • モジュール
  • 全て

の3種類があります。

f:id:hainarashi:20201117134725j:plain

タイプ

 

[リピート]

シミュレーションの自動実行です。

  1. ドメインのパラメーターを変更して、
  2. 開始フレームからアニメーションを再生する。

以上を行うと、シミュレーションが自動で更新されます。

 

次のような変更では、シミュレーションは更新されません。

  • ドメインオブジェクトの移動・回転・スケール
  • フロー(流体の発生源)やエミッター(障害物)のパラメーター変更・移動など

これらの変更をシミュレーションに反映させるには、ドメインのパラメーターを操作する必要があります。
その際、実際に数値などを変更する必要はないので、「パラメーターにカーソルを合わせて入力状態にして、何も変更せずにそのままEnterで確定する」という操作でOKです。

 

[モジュール]

シミュレーションの手動実行です。

  • パーティクルによる流体の「動き」のシミュレート
  • パーティクルを元にしたメッシュの生成

を個別に行います。

「データをベイク」をクリックすると、シミュレーションが実行されます。
その後で「メッシュをベイク」をクリックすると、メッシュが生成されます。
ベイクの済んだパラメーターはグレー表示になり、変更を受け付けなくなります。

f:id:hainarashi:20201124213628j:plain

ベイクのスイッチ

 

やり直したい場合は、ベイク後に表示される「データを解放」「メッシュを解放」をクリックします。
ベイク済みのキャッシュが削除され、パラメーターは変更可能な状態に戻ります。

 

ベイクの途中にEscキーを押すと、ベイクは中断されます。
ベイクが中断されると、「Resume」と「Free」のボタンが表示されます。
「Resume」をクリックすると、中断したフレームからベイクが再開されます。
※Resumeを行うには、後で説明する「Is Resumable」をベイクの前にONにしておく必要があります。

「Free」は「解放」と同じで、中断までのキャッシュが削除されます。

 

[全て]

シミュレーションの手動実行です。
タイプの少し下に表示される「すべてベイク」をクリックすると、パーティクルとメッシュが一度にベイクされます。
それ以外の挙動はモジュールと同じです。

 

[タイプの使い分け]

基本的に「リピート」か「モジュール」を使います。
「全て」は個別のベイクができないので、試行錯誤に向きません。

 

「リピート」と「モジュール」は、使いやすい方を使えばOKです。
ただし、レンダリングの前には必ずモジュールにしてベイクをします。

リピートのままでもレンダリングはできるのですが、何かのはずみで、思わぬタイミングでシミュレーションが更新されてしまうことがあります。
流体シミュレーションはランダム性があるので、設定が同じでも、決して同じ結果にはなりません。
もしアニメーションレンダリングの途中でシミュレーションが更新されてしまうと、前後がつながらなくなってしまうので、最初からレンダリングのやり直しになってしまいます(実体験)。

 

Is Resumable

これをONにすると、ベイクの中断・再開ができるようになります。

マニュアルによると

Extra data will be saved so that you can resumed baking after pausing. Since more data will be written to drive it is recommended to avoid enabling this option when baking at high resolutions.

(一時停止後にベーキングを再開できるように、キャッシュにデータが保存されます。ドライブに書き込まれるデータが多くなるので、高解像度でベーキングする場合はこのオプションを有効にしないことをお勧めします。 ※原文を元に翻訳)

とのことです。

 

しかし、タイプがモジュールの場合はこれをONにしておかないとメッシュのベイクができません。
理由は分かりませんが、そういう作りになっています。
そのためモジュールを使う際は必ずONにします。

f:id:hainarashi:20201124174825j:plain

Is Resumable

 

メッシュ

流体のメッシュ使用のON・OFFを切り替えます。

Mantaflowは

  1. まずパーティクルで液体の動きを計算する
  2. その後でパーティクルを元に、液体のメッシュを生成する

という手順で液体を作ります。

メッシュをONにすると、液体のメッシュが生成できるようになります。
また、液体のメッシュがベイク済みでも、OFFにするとメッシュは非表示になります。

f:id:hainarashi:20201124220151j:plain

メッシュ

 

開始フレーム、終了フレーム

流体シミュレーションを行うフレーム範囲です。
アニメーションのフレーム範囲とは別に設定できます。

例えば「水門がゆっくり開き、やがて水が流れ出す」というようなアニメーションでは、水門が開くまでシミュレーションは必要ありません。
このような場合「水が流れ出す」のところからシミュレーションを開始するように設定して、無駄を省くことができます。

f:id:hainarashi:20201124175322p:plain

開始・終了フレーム

 

キャッシュディレクト

キャッシュディレクトリは、キャッシュが保存されるフォルダです。
ドメインに対して自動で設定されます。

f:id:hainarashi:20201202214629j:plain

キャッシュディレクト

 

[自動設定の場所]

キャッシュディレクトリが自動設定される場所は、次の2パターンがあります。

 

  1. blendファイルが保存されている
     → blendファイルと同じフォルダ

  2. blendファイルが保存されていない
     → tempフォルダ

※tempフォルダの場所は「編集 > プリファレンス > ファイルの場所」から確認できます。
 デフォルト位置は C:\Users\(ユーザー名)\AppData\Local\Temp\ です。

 

キャッシュディレクトリはblendファイルからの相対参照で設定されます。

1の場合、blendファイルとキャッシュフォルダを一緒に移動すれば、移動先でもシミュレーション結果をそのまま使うことができます。

2の場合、blendファイルを移動するとキャッシュフォルダとの相対位置が狂うので、シミュレーション結果が使えなくなります。

そのため、流体シミュレーションを行う際は、まず最初にblendファイルをどこかに保存しておくと、その後の管理がしやすくなります。

 

[フォルダ名は日本語不可]

キャッシュフォルダが作成されるフォルダツリーの中に1つでも日本語名のフォルダが含まれていると、キャッシュが保存されず、シミュレーションが正常に動作しなくなります。
特にPCのアカウント名を日本語で作成していると、ユーザーフォルダ名も日本語になるため、そのサブフォルダ全てがシミュレーション用に使えなくなります。
こういう場合は、どこか別の場所にシミュレーション用のフォルダを用意する必要があります。

 

[キャッシュフォルダ名]

キャッシュフォルダ名は、そのフォルダのパスを元に自動で生成されます。
同じフォルダに複数のblendファイルがあり、それぞれに流体シミュレーションを設定すると、キャッシュフォルダ名はどれも同じになります。
キャッシュフォルダ名が重複していると、別々のシミュレーションが同じキャッシュを参照するので、AでベイクしたキャッシュがBから上書きされるといった不具合が発生します。

こういう場合は重複を回避するため、先に作成されたキャッシュのフォルダ名とキャッシュディレクトリを手動で変更します。

 

フロー(Flow)

フローは流体の発生源です。
液体・煙・炎はフローから流れ出します。
※流体を消失させる出口にすることもできます。いずれ別の記事で解説します。

f:id:hainarashi:20201204220736j:plain

フロー

 

クイックエフェクトの初期設定では、フローの挙動は「ジオメトリ」になっています。
ジオメトリは、シミュレーションの開始時に「そのオブジェクトの形をした液体の塊」を発生させます。

フローオブジェクトはどんな形でもOKです。

f:id:hainarashi:20201203163800j:plain

いろいろな形のフローオブジェクト

 

フローオブジェクトをレンダリングしたくない場合は、アウトライナーレンダリング非表示に設定します。

f:id:hainarashi:20201203171022j:plain

フローのレンダリング表示切り替え

 

 

以上、「水の塊をばしゃんと落とす」解説編でした。

 

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

 

Blenderで流体シミュレーション/液体(1) 「水の塊をばしゃんと落とす」実践編

f:id:hainarashi:20201108214303j:plain

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

 

簡単な見本を作りながら、流体シミュレーションの使い方を紹介していくシリーズ。
第1回は、「水の塊をばしゃんと落とす」やり方です。

 

今回の記事は長いので、前・後編に分けています。
この実践編では、実際にシーンを作成。
次の解説編では、今回使用する機能やパラメーターについて詳しく説明します。

 

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

hainarashi.hatenablog.com

 

流体シミュレーションの予備知識

流体シミュレーションは、リアルな液体・煙・炎を作り出すシミュレーションです。

f:id:hainarashi:20201107214503j:plain

流体シミュレーション(Mantaflow)の煙と炎

※画像出典:Reference/Release Notes/2.82/Physics - Blender Developer Wiki

 

液体シミュレーションと気体(煙・炎)シミュレーションは、Blender2.81まで別々でしたが、2.82からは「Mantaflow」という1つの流体シミュレーションに統合されました。

「流体」と聞くと、なんとなく液体のことだと思ってしまいますが、「流動性のある物体」を指します。
つまり気体も液体も流体で、同じ計算方法でシミュレーションできるのだそうです。

 

2.81以前の方式に比べ、Mantaflowには次の特徴があります。

  • シミュレーション結果の動きと形が綺麗。
  • 液体と気体(煙・炎)の基本的な操作方法が同じなので、操作を覚えやすい。

「覚えやすい」とは言っても、流体シミュレーションはパラメーターが多く、最低限必要なものを覚えるだけでもなかなか大変です。

そこでこのシリーズでは、簡単な見本を作りながら、流体シミュレーションの操作方法に少しずつ慣れていこうと思います。

 

なお、液体と気体(煙・炎)では、液体の方が扱いが簡単です。
まずは液体の初歩から始めて、Mantaflowの操作自体に慣れてきたら、気体(煙・炎)へも進む予定です。

 

実践「水の塊をばしゃんと落とす」

今回作るのは、こちらのアニメーション(150フレーム)です。

f:id:hainarashi:20201111221433g:plain

完成見本

 

※高画質版はこちらのリンクからどうぞ。

#Blender 【講座の見本】水の塊をばしゃんと落とす - 灰ならしのうごイラ - pixiv

 

では、サクッと作ってみましょう。

 

1. 適当な場所にblendファイルを保存。

f:id:hainarashi:20201105101742j:plain

blendファイル保存

 

2. 追加 > メッシュ > ICO球(Ico Sphere

3. ICO球を選択した状態で
 「オブジェクト > クイックエフェクト > クイック液体」をクリック。

f:id:hainarashi:20201205151504j:plain

クイックエフェクト

 

クイックエフェクトにより、次の2つが自動で追加されます。

  • ドメインオブジェクト(流体シミュレーションの計算領域)
  • ICO球にフロー(液体の発生源)の設定

f:id:hainarashi:20201205151511j:plain

自動設定

 

アニメーション再生すると、ICO球から発生したパーティクルの塊が落ちて、ばしゃんとなる様子がシミュレートされます。

f:id:hainarashi:20201105112737j:plain

パーティクルアニメーション

 

4. アニメーションの終了フレームと、ドメインのシミュレーション終了フレームを、両方とも150に変更。

f:id:hainarashi:20201106212316j:plain

フレーム数の設定

 

5. ドメイン設定「液体 > メッシュ」にチェックを入れ、アニメーション再生をする。

パーティクルの形を元に、液体のメッシュが生成されます。

f:id:hainarashi:20201204125921j:plain

メッシュ生成

 

6. ドメイン設定「設定 > Resolution Divisions(解像度)」を64に変更して、アニメーション再生をする。

液体の形がきめ細かくなります。

f:id:hainarashi:20201204125914j:plain

解像度変更

 

7. シミュレーションのベイク(計算結果の固定処理)をする。

 (1) 「キャッシュ > タイプ」を「モジュール」に変更
 (2) 「キャッシュ > Is Resumable」にチェックを入れる
 (3) 「設定 > データをベイク」をクリック
 (4) 「液体 > メッシュ > メッシュをベイク」をクリック

f:id:hainarashi:20201204130806j:plain

シミュレーションのベイク

 

以上で「水の塊をばしゃんと落とす」シミュレーションは完了。
仕上げに背景などを設定します。

 

8. 追加 > メッシュ > 平面

液体の下に平面を配置して床にします。

  • スケール×10
  • 液体の下に移動(位置は目測でOK)

f:id:hainarashi:20201111222927j:plain

床を配置

 

9. 追加 > ライト > サン

  • 強さ:3
  • 向きは好きなように

f:id:hainarashi:20201111222918j:plain

ライトを配置

 

10. ワールドに環境テクスチャを設定。

環境テクスチャの映り込みで、単色背景に比べて液体の色合いに変化が出るため、よりリアルになります。

  • 環境テクスチャは何でもOK。
  • 背景ノードの強さは、環境テクスチャに応じて設定。 

f:id:hainarashi:20201112202351j:plain

環境テクスチャを設定

 

11. 液体のマテリアルを設定。

液体のマテリアルはドメインに設定します。
基本形はクイックエフェクトで自動設定されているので、下の画像を参考にカラーなどを変更します。

f:id:hainarashi:20201204142920j:plain

マテリアルを設定

 

12. ICO球をレンダリング非表示にする。

13. レンダーエンジンをCyclesにする。

f:id:hainarashi:20201204133219j:plain

レンダリング設定

 

以上で設定は終了。
構図を決めてレンダリングしたら完成です。

f:id:hainarashi:20201103093304j:plain

完成

 

マテリアルについて

クイックエフェクトでドメインに自動設定されるマテリアルは、「グラス」と「ボリュームの吸収」で構成されています。

水など透過系の液体は、このままグラスで作るのが簡単です。
泥水、ペンキ、牛乳、血液、水銀、ゲルなど半・不透明の液体は、プリンシプルBSDFなどで作ります。

f:id:hainarashi:20201120143438j:plain

シェーダーの使い分け

 

グラス

液体の色はグラスのカラーで設定します。

粗さは表面の滑らかさ。
液体は0.0です。

IOR(屈折率)は、実際の液体に基づいた値にします。
自動設定の初期値(1.330)は水の屈折率です。

これらのパラメーターは、プリンシプルBSDFで伝播を使った場合のベースカラー、粗さ、IORと同じ働きです。
詳しくはこちらの2つの記事を参照してください。

hainarashi.hatenablog.com

hainarashi.hatenablog.com

 

ボリュームの吸収

ボリュームの吸収を使うと、液体の厚さに応じて色味が付くようになります。

液体の色を濃いめ、または暗めにしたい場合、グラスのカラーだけで調節すると全体に色が付いてしまい、今イチな結果になります。
ボリュームの吸収を併用すると、よりリアルな深みのある液体が表現できます。

f:id:hainarashi:20201121170147j:plain

深みのある液体の色表現

 

薄め・明るめの液体の場合も、ボリュームの吸収を軽く効かせておくと、なんとなく良い感じの質感になります。

 

CyclesとEEVEEの違い

透過系の液体のレンダリングには、Cyclesの方が向いています。

EEVEEの屈折は簡易表現で、カメラから見て一番手前の面だけを処理するので、水しぶきのように複雑な形状では物足りない結果になります。

ただし、アニメーションの場合は動きでディテールがまぎれるため、EEVEEで充分な場合もあります。

f:id:hainarashi:20201205154713j:plain

CyclesとEEVEEの比較

 

EEVEEはメッシュ形状に基づくボリュームには対応していないため、マテリアルにボリュームの吸収を設定していても無効になります。

f:id:hainarashi:20201205161954j:plain

EEVEEではボリュームの吸収が無効になる

 

EEVEEで屈折表現をするには専用の設定が必要です。
詳しくはこちらの記事を参照してください。

hainarashi.hatenablog.com

 

 

以上、「水の塊をばしゃんと落とす」実践編でした。 
次回の解説編で、今回使用した機能やパラメーターについて詳しく説明します。

 

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

 

プリンシプルBSDFでいろいろな質感の作り方(8) サブサーフェスの使い方/後編

f:id:hainarashi:20201019220511j:plain

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

 

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

 

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

 

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

hainarashi.hatenablog.com

 

SSSの設定手順

SSSは次の手順で設定すると、分かりやすく、やり直し無く設定できます。

 

1. オブジェクトの拡大縮小を済ませ、サイズを確定する。
 (スケールの適用はしなくてもOK)

2. ベースカラーとサブサーフェスカラーに同じ色(またはテクスチャ)をつなぐ。

3. サブサーフェスを1.0にする。

f:id:hainarashi:20201021110857j:plain

設定手順 1~3

 

4. サブサーフェスに値ノードをつなげる(※)。

5. サブサーフェス範囲(0.0~1.0)で散乱光の色味を、
 値ノード(0.0~100.0)で光の届く範囲を設定する。

※値ノードをサブサーフェス範囲につなげると色味の設定ができなくなってしまうので、この段階ではサブサーフェスにつなぎます。

f:id:hainarashi:20201013213019j:plain

設定手順 4~5

 

6. 設定が済んだら、サブサーフェスからサブサーフェス範囲に値ノードをつなぎ直す。
 これで、サブサーフェスでSSSの強さを調整できるようになります。

f:id:hainarashi:20201013214416j:plain

設定手順 6

 

以上で完了です。

オブジェクト内でSSSに強弱をつけたい場合は、サブサーフェスにテクスチャをつないでサブサーフェスマッピングをします。

 

EEVEEの設定

EEVEEでSSSを使う際は「マテリアルタブ > サブサーフェスの透光」をONにします。

後ろから光が当たった時に、手前まで光が通って明るく見える様子が描画されます。

f:id:hainarashi:20201014133825j:plain

サブサーフェスの透光

 

EEVEEでの透過・屈折用の設定は、SSS用の設定よりも優先されます。

  • 「マテリアルタブ > 設定 > ブレンドモード」がアルファブレンドになっている
  • 「レンダータブ > スクリーンスペース反射 > 屈折」と
    「マテリアルタブ > 設定 > スクリーンスペース屈折」がONになっている

このどちらかが設定されていると、SSSは描画されません。

透過系のマテリアルを元にSSS用に作り直した場合、これらの設定が残っている事があるので要注意です。

f:id:hainarashi:20201021111053j:plain

設定の優先順位

 

EEVEEのSSSは、計算処理の仕組みによる帯状の模様が発生します。

f:id:hainarashi:20201014211903j:plain

帯状の模様

 

この模様が出ないようにするには「レンダータブ > SSS」から

で調整します。

 

サンプル数

SSSを計算するサンプル数です。
数値を大きくするほど帯模様の間隔が狭まり、滑らかになります。

f:id:hainarashi:20201014215819j:plain

サンプル数

 

ジッターのしきい値

この割合以下のサンプルをランダムに回転させて、帯模様が目立たないようにします。
数値が大きいほど効果が強くなり、帯模様が目立たなくなります。

f:id:hainarashi:20201014215826j:plain

ジッターのしきい値

 

イメージとしては、サンプル数が「解像度」、ジッターのしきい値が「デノイズ」または「アンチエイリアス」的な働きです。

どちらも数値が大きいほど綺麗になりますが、レンダリング時間も長くなります。
ある程度綺麗になると、それ以上見た目の変化はしなくなるので、必要な分だけ数値を上げます。

 

EEVEEとCyclesの違い

EEVEEとCyclesでは、SSSを使った仕上がりが大きく異なります。
マテリアルの調整は、どちらでレンダリングするか決めてから行います。

f:id:hainarashi:20201017144740j:plain

EEVEEとCycles

 

CyclesではSSSの計算方法(サブサーフェスメソッド)を「Christensen-Burley」「Random Walk」の2種類から選択できます。

f:id:hainarashi:20201017150344j:plain

サブサーフェスメソッド

 

Christensen-Burleyは2.7系から搭載されている古いバージョン。
Random Walkは2.8で搭載された新しいバージョン。
仕組み的な違いはよく分かりませんが、Random Walkの方が品質が良いようです。

 

下の画像は肌の部分にSSSを使用したモデルの比較です。
Random Walkの方がまぶた・耳・鼻・唇などのディテールがしっかりしていて、綺麗な仕上がりになっています。

f:id:hainarashi:20201017152631j:plain

サブサーフェスメソッドの違い

 

※画像出典:YouTube "Blender Cycles Random Walk SSS (New Feature!)" 

www.youtube.com

 

マニュアルによると、Random Walkは「閉じたメッシュに最適です。メッシュの面と穴が重なると、問題が発生する可能性があります」だそうです。
この点は検証していないので、どのような場合に問題が起こるのかは、皆さんで確かめてください。

 

なお、Random Walkが使えるのはCyclesのみです。
EEVEEでRandom Walkにしても、レンダリングはChristensen-Burleyの結果になります。

 

SSSの使い処

「半透明」の使い分け

解説サイトなどでは、SSSが「半透明な物体の質感」と書かれていることがあります。

一言で「半透明」と言っても、言葉的な意味は

  1. 光は通すけれども、向こうは透けて見えない半透明
  2. 向こうがぼんやりと透けて見える半透明
    (すりガラス、タッパー、プラスチックの収納ケース、レジ袋など)

の2種類があります。

SSSで表現するのは1の半透明です。

2の半透明はSSSではなく伝播を使って、粗さ(ラフネス)または伝播の粗さ(Cycles限定)を上げて作ります。

f:id:hainarashi:20201018162718j:plain

向こうが透けて見える半透明

 

伝播の使い方はこちらの記事を参照してください。

hainarashi.hatenablog.com

 

実物の表面下散乱とマテリアルのSSS

プラスチックの洗面器やカーテンなどは、向こうの光や影が透けて見えます。
実のところ、プラスチック・木材・紙製品・布など、身の周りの多くの物が光を通す性質を持ち、表面下散乱があります。

しかしマテリアルを作る上では、普通これらにSSSは設定しません。
理由としては、まずSSSは使えば使うほどレンダリング時間が長くなるため。
それとSSSは表現力に限界があり、使うとかえって不自然になる場合があるためです。

f:id:hainarashi:20201018211249j:plain

SSSで不自然になる見本

 

SSSは「使わないと柔らかい質感が表現できない物」、つまり実物で考えると「光を通す性質が大きい物」に絞って使います。

 

障子やカーテンに映る影

障子やカーテンなどで、反対側の影が映って見える表現はSSSで作ります。

f:id:hainarashi:20201019210404j:plain

SSSで影絵表現


厚みの無いメッシュにSSSを設定すると、Cyclesではうまく描画されません。

f:id:hainarashi:20201019212742j:plain

厚みの無いメッシュのSSS

 

Cyclesではボリューム(メッシュ構造内部の立体空間)を元にした丁寧な方法でSSSを計算しているため・・・らしいです(正確な仕組みはよく分かりません)。
EEVEEは簡易表現なので、逆にうまい具合に処理されるようです。

 

こういう場合は

  • 編集モードで面を押し出す
  • ソリッド化モディファイアを追加する

のどちらかの方法で、ほんの少しでも面に厚みを付ければSSSが正常に描画されます。

f:id:hainarashi:20201019215107j:plain

CyclesのSSSは面に厚みが必要

 

 

以上、サブサーフェスの使い方/後編『SSSの設定方法など、具体的な使い方について』でした。

 

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

 

ミクさんの3Dモデル

ミクさんの3Dモデルはこちらからお借りしました。

3d.nicovideo.jp

 

参考サイト

Subsurface scattering - Wikipedia

An Introduction To Real-Time Subsurface Scattering

Principled (プリンシプル) BSDF — Blender Manual

SSS(サブサーフェイススキャッタリング)のお話|高原さと|note

 

プリンシプルBSDFでいろいろな質感の作り方(7) サブサーフェスの使い方/前編

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の設定方法など、具体的な使い方について』に続きます。

 

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

 

プリンシプルBSDFでいろいろな質感の作り方(6) スペキュラーについて

f:id:hainarashi:20200916182021j:plain

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

 

プリンシプルBSDFで、いろいろな質感表現の方法を探っていくシリーズ。
第6回はスペキュラーについてです。
「○○の作り方」という枠に収まらないので、単独で解説します。

 

スペキュラーとは

スペキュラーは非金属の鏡面反射率です。
スペキュラーが大きいほど反射・光沢が強くなります。

f:id:hainarashi:20200909162606j:plain

スペキュラー

 

レンガやコンクリートアスファルトなどは光を反射しないような気がしますが、実は反射します。
レンガに横~斜めから光を当てると白く光って見える、これがレンガの反射光です。

f:id:hainarashi:20200910135027j:plain

レンガの反射光

 

レンガに限らず、すべての物質は光を反射する性質を持ちます。

なので「マテリアルの光沢を消したい」場合でも
スペキュラーを0にしてはいけません。

スペキュラーを0にしてしまうと、上のレンガのような「光の当たる角度によって生じる光沢」まで生じなくなってしまいます。

こういう場合は粗さ(ラフネス)を上げて、光沢が「見えなく」なるようにします。

f:id:hainarashi:20200910161927j:plain

光沢を消す時は粗さ(ラフネス)を上げる

 

光沢の設定手順

スペキュラー0.0~1.0は、反射率0~8%に対応します。
スペキュラーの初期値0.5は、反射率4%です。
この値はほとんどの非金属で良い具合の反射になるので、基本的にそのままでOKです。

 

光沢の設定は

  1. まず粗さ(ラフネス)を調整して、光沢の鮮明さ(ぼやけ具合)を決める
  2. その上で、光沢の強さそのものを変えたい場合は、スペキュラーを変更する

という手順で行います。

 

実測によると、現実の物質(非金属)の反射率は2~5%の範囲なので、スペキュラーを変更する場合はこれを換算した0.25~0.625の範囲で調整します。

スペキュラーを変更する際の決まりや指標的なものは特に無いらしいので、画面上の見た目を元に好みで調整します。

ただし、ガラスなど透過系の素材の場合は、実際の物質に基づいたスペキュラーの値にするのが基本です。
詳しくはこちらの記事を参照してください。

hainarashi.hatenablog.com

 

細かいひび割れや窪みの表現

スペキュラーには

  1. 材質自体の質感表現をする
  2. 細かいひび割れや窪みで光が入らない場所を表現する

という二種類の使い方があります。
前項は1の説明でした。この項では2について説明します。

 

下の画像を比べてみてください。

f:id:hainarashi:20200918090954j:plain

板張り比較

 

Bの方が、よりリアルに見えると思います。
この違いはスペキュラーマッピングの有無が元になっています。

 

Aのマテリアルは

という2つの要素で作っています。 

これだけでは板の隙間部分に光沢ができてしまい、違和感があります。

f:id:hainarashi:20200918091709j:plain

Aのマテリアル

 

本来ならば、板の隙間部分には光が入らず、光沢はできないはずです。
しかしバンプによる凹凸は擬似的な表現なので、実際に板の隙間が窪んでいるわけではありません。
そのため、隙間(のはず)の部分にも板面と同じ強さで光が届き、光沢ができてしまうのです。

 

そこで、スペキュラーマッピングを追加したのがBのマテリアルです。

f:id:hainarashi:20200918091702j:plain

Bのマテリアル

 

スペキュラーマッピングにより、板面のスペキュラーは0.5、隙間の部分は0にしてあります。
これで隙間には光沢が無くなり、よりリアルな板張りを表現できるようになりました。

 

このように、スペキュラーは

  • 細い溝
  • ひび割れ
  • 小さい穴

などで光が届かず光沢ができない(弱い)表現に使うことができます。

(余談:これらの「細かい陰」の元になるテクスチャを「キャビティマップ」と言います。 ※cavity(キャビティ):空洞、窪み、穴 

 

こちらはスペキュラーマップ(キャビティマップ)の効果がとても良く分かる動画です。
※プリンシプルBSDFが導入される前の動画なので "Refrection Map" という呼び方になっています。

www.youtube.com

 

金属での反射率の操作方法

スペキュラーは非金属でのみ働くパラメーターです。
金属(メタリック 1.0)でスペキュラーの値を変えても何も変化しません。

f:id:hainarashi:20200918133204j:plain

金属のスペキュラー(効果無し)

 

金属の反射率はベースカラーで操作します。
光沢を減らしたい部分はベースカラーの明度を下げます。
黒(#000000)で全く光を反射しなくなります。

f:id:hainarashi:20200918133158j:plain

金属の反射率操作

 

粗さ(ラフネス)との使い分け

例えばタイル張りの場合、目地部分はそんなに深く窪んでいるわけではないので、光は普通に中まで届きます。
しかし目地の部分まで光沢があると、おかしな感じになります。

f:id:hainarashi:20200918104819j:plain

タイル張り比較

 

実物で考えると、これは「タイルはツルツル、目地はザラザラ」という表面の粗さの違いが原因です。
こういう場合は、スペキュラーではなく粗さ(ラフネス)で違いを出します。

f:id:hainarashi:20200918105745j:plain

ラフネスマッピング

 

補足と余談

反射率とF0

この記事では解りやすいようにスペキュラーを「反射率」と表現してきましが、正しくは「ある面に垂直に光が当たった時のフレネル反射率」です。
(これを「F0」と言います)

この辺りの詳しい説明は、個人が趣味で使う分には必要ないので省きます。
興味のある方は、記事のラストで紹介している参考サイトなどを参照してください。

 

光を反射しない物質

「すべての物質は光を反射する性質を持つ」と書きましたが、反射率が0に近い物質もあります。
例外中の例外なのでマテリアル作成的に気にする必要はありませんが、モノとして面白いので紹介しておきます。

logmi.jp


それと、ブラックホールは反射率0%だそうです。これも例外ですね。

以上、スペキュラーについてでした。

 

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

 

火焔土器の3Dモデル

火焔土器の3Dモデルはこちらのサイトからお借りしました。

jomon-supporters.jp

 

参考サイト

Principled BSDF の使い方

『THE COMPREHENSIVE PBR GUIDE Volume 1: The Theory of PBR by Allegor…

『THE COMPREHENSIVE PBR GUIDE – Vol. 2: Practical guidelines for creat…

DONTNOD Physically based rendering chart for Unreal Engine 4 | Sébastien Lagarde

Physically Based Materials | Unreal Engine Documentation

PBRマテリアルのテクスチャは実際どのようなテクスチャなのか – tkmkrocket_tech

フレネル反射率について - OLD hanecci’s blog : 旧 はねっちブログ