Blenderシェーダーノード辞典/屈折BSDF(Refraction BSDF)
※記事製作時のバージョン:Blender 3.4
⇒ Blenderシェーダーノード辞典/目次
概要
屈折シェーダーは、光の透過と屈折を表現するノードです。
水やガラスをすかして見るように、サーフェスの向こう側が歪んで見える状態を作ります。
屈折シェーダーはグラスシェーダー(または[伝播:1]のプリンシプルBSDF)と似ていますが、次のような違いがあります。
グラスシェーダー(または[伝播:1]のプリンシプルBSDF)
⇒ 水やガラスの質感を再現します。単体で使うことができます。屈折シェーダー
⇒ 光の屈折だけを描画します。基本的に単体では使わず、他のノードと組み合わせて使用します。
「屈折だけが見える」という状態は現実の物質には存在しないので、ちょっとイメージしにくいですが、次のように比較すると分かりやすくなると思います。
【1】グラスシェーダーで作った水面
現実の水の質感が再現されます。
水面を斜め~水平方向から見ると周囲が映り込み、水中は見えなくなります。
【2】屈折シェーダーだけで作った水面
水面をどの角度から見ても周囲は映り込まず、歪んだ水中が見えます。
これが屈折だけの状態です。
屈折シェーダーは、グラスシェーダーやプリンシプルBSDF(伝播:1)では作れない特殊な質感の表現に使います。
主な例としては、プリズムなどで光が虹色に分解される分光と、攻殻機動隊で有名な光学迷彩があります。
【分光】
【光学迷彩】
これらの詳しい作り方は後で解説します。
ところどころ真っ黒になるのはなぜ?
屈折シェーダーを単体で設定すると、オブジェクトがところどころ真っ黒になります。
これは実際の水やガラスならば、全反射という現象が生じるはずの部分です。
全反射とは、「水やガラスなどの中から空気中を見ると、斜め~水平方向から見る面の反射率が100%になる」現象です。
水に潜って上を見ると、水面が鏡のように水中を映しますが、あれが全反射です。
(全反射が生じる原因は、水やガラスの屈折率が空気の屈折率より大きいためです。ここでは詳しい仕組みの説明は省きますが、「全反射」で検索するといろいろな解説がすぐに見つかるので、興味のある方はそちらを参照してください。)
例えばグラスシェーダーで水面を設定した場合、現実の水の質感が再現されるので、全反射も表現されます。
しかし屈折シェーダーだけで水面を設定すると反射が表現されないので、本来なら全反射になるはずの部分が真っ黒になります。
「屈折率が原因で水上からの光がまったく届かない状態」を正しく描画している、と表現すると分かりやすいでしょうか。
下の画像の右側で真っ黒に見えているのも、本来なら全反射になるはずの部分です。
なお、全反射は「水やガラスの中から空気中を見る場合」に起こる現象です。
逆に、空気中から水やガラスを見る場合は、面をどの角度から見ても全反射は発生しません。
これはCG的に表現すると、「サーフェスを裏側から見た時だけ全反射が発生する」ということになります。
上の画像の右側で真っ黒に見えている部分は、実はガラスの塊の向こう側の面で、それが手前の面を透過して見えている状態です。
各パラメーターの働きと設定方法
カラー(Color)
透過光の色に影響を与えます。
ガラスに色をつける感じです。
カラーの明度(V)は、透過光の減衰に影響します。
白(V:1)の場合はまったく減衰せず、元の光と変わらない明るさで透過します。
Vが小さくなるほど透過光は弱く(暗く)なり、黒(V:0)では完全に光を透過しなくなります。
粗さ(Roughness)
サーフェスの粗さを操作するパラメーターです。
透過光の鮮明さに影響します。
この値が小さいほどクッキリして、大きいほどモヤけます。
IOR(屈折率)
Index of Refractionの頭文字で、直訳するとズバリ屈折率です。
ガラスなどを透かして見ると向こうが歪んで見えるのが屈折ですが、その歪みの強さを表します。
[1.0]が屈折無し。値が大きくなるほど歪みも大きくなります。
IORを実際の物質に基づいた値に設定すると、その物質の質感を再現できます。
主な透過系の材質のIORは次の通りです。
IOR:材質
1.31:氷
1.33:水
1.45:ガラス・アクリル・ポリプロピレン・食用油脂・石油製品(ガソリン・灯油・オイルなど)
1.54:水晶・琥珀
1.57:アクアマリン・エメラルド・ポリスチレン・PET・ポリカーボネート・ポリ塩化ビニル
1.63:トルマリン・トパーズ
1.76:ガーネット・サファイア・ルビー
1.98:ジルコン
2.41:ダイヤモンド
この一覧は、使いやすいように数値を簡略化しています。
あまり厳密な数値にこだわりすぎると扱うのが大変なので、このくらい大まかにまとめた方が実用的です。
なお、現実の物質とは関係ない特殊な質感を表現する場合は、これらの値にこだわらず、画面上の見た目を元に好みで設定してOKです。
Distribution(分布)
サーフェスの粗さを表現するための計算方式を選択するパラメーターです。
シャープ、GGX、ベックマンの3種類があり、それぞれ透過光の見た目が変化します。
各方式の特徴は次のようになります。
シャープ(Sharp)
粗さを表現しないモードです。粗さの値は無視され、完全に滑らかな面の透過光が描画されます。GGX
3DCGで標準的に使われる方式です。ベックマン(Beckmann)[Cyclesのみ対応]
物理的に正確な透過光が表現できますが、計算が重くなります。
下の画像は、CyclesでDistributionを切り替えた比較です(粗さは[0.2]で固定)。
透過・屈折の質感としてはベックマンが一番きれいな仕上がりになるので、基本的にはデフォルトのベックマンのまま使用すればOKです。
なお、ベックマンはCyclesのみ対応です。
EEVEEでベックマンを選択した場合は、GGXとして描画されます。
※Distributionの仕組みについては、光沢シェーダーの記事でより詳しく解説しています。
EEVEEでの屈折表現について
ここまでの見本画像は、すべてCyclesでレンダリングしています。
EEVEEを使用すると、屈折の具合が異なります。
Cyclesのレンダリングは「現実をできるだけ再現する」方法なので、時間がかかりますが、屈折もほぼ現実と同じになります。
EEVEEは「最低限のレンダリングをして、屈折や反射はそれらしく見えるように後付けで画像処理をする」方法なので、非常に高速ですが、少し不自然な屈折になります。
また、EEVEEでは「一番手前の面だけをレンダリングする(重なり合う面はレンダリングを省略する)」ので、「本来なら全反射になるはずの真っ黒の部分」は描画されなくなります。
なお、EEVEEで透過・屈折を描画するには、専用の設定をする必要があります。
※EEVEEの透過・屈折の設定方法については、私のブログ『EEVEEで屈折の設定方法』を参照してください。
―――――――――――――――
屈折シェーダーの主な使用例として、「普通の水やガラス」「分光」「光学迷彩」の作り方を紹介します。
水やガラスなどの作り方
【1】屈折シェーダーと光沢シェーダーを用意します。
光沢シェーダーは次のように設定します。
・Distribution:ベックマン
・カラー:白(FFFFFF)
・粗さ:0
【2】屈折シェーダーと光沢シェーダーを、シェーダーミックスでミックスします。
シェーダーミックスは次のように接続します。
・第1シェーダー(上):屈折シェーダー
・第2シェーダー(下):光沢シェーダー
これで、屈折と反射がミックスされた質感になります。
しかしこの段階ではミックスの割合が1:1なので、オブジェクト全体が「うっすら向こうが透けて見えつつ手前も映り込んでいる」という不自然な見た目になります。
これで、カメラから見た面の向きを元に最適な反射率(透過率)が設定され、現実の水やガラスなどと同じ質感が再現できます。
フレネルと屈折シェーダーの[IOR]は同じ値にする必要があるので、一括で操作できるようにします。
【4】フレネルと屈折シェーダーの[IOR]に、値ノードを接続します。
これで、値ノードを調整するだけで両方の[IOR]を操作できるようになります。
以上で、できあがりです。
この設定はグラスシェーダーとほぼ同じ質感になりますが、屈折の[粗さ]と光沢の[粗さ]を別々に操作できる点が異なります(プリンシプルBSDFの[伝播の粗さ]と同様の操作ができる状態です)。
分光の作り方
プリズムなどで屈折した光が虹色に見える、分光の表現を作ります。
※Cycles・EEVEEどちらでも使える設定です。
【1】屈折シェーダーを3つ用意して、それぞれのカラーを次のように設定します。
・R:1、G:0、B:0
・R:0、G:1、B:0
・R:0、G:0、B:1
それぞれの屈折シェーダーを単体で設定した場合、下の画像のようになります。
【2】この3つの屈折シェーダーを、シェーダー加算で合成します。
これで光の三原色が合成され、オブジェクトは無色透明になります。
※この合成の場合、シェーダーミックスでは目的の結果にならないので、シェーダー加算を使います。
次に、透過光の「色ずれ」を作ります。
【3】屈折シェーダーのIORを次のように設定します。
・赤い屈折シェーダー IOR:1.40
・緑の屈折シェーダー IOR:1.45(デフォルト)
・青い屈折シェーダー IOR:1.50
これで各色が異なる屈折率になり、透過光の色がずれます。
この段階では透過光がくっきり3色に分かれるので、もっと滑らかな色変化にします。
【4】値ノードを追加して、値を[0.15]に設定します。
【5】全ての屈折シェーダーの[粗さ]に、値ノードを接続します。
これでそれぞれの透過光がぼやけて色が混ざり、虹色のような色変化になります。
さらに、バンプマッピングで透過光に揺らぎをつけます。
透過光に揺らぎをつけると、内部の材質の不均質さが表現され、よりリアルな見た目になります。
【6】テクスチャ座標、ノイズテクスチャ、バンプを追加します。
バンプの[強さ]は[0.05]にします。
【7】この3つのノードを、次のように接続します。
・[テクスチャ座標:オブジェクト]>[ノイズテクスチャ:ベクトル]
・[ノイズテクスチャ:係数]>[バンプ:高さ]
・[バンプ:ノーマル]>[屈折シェーダー(全部):ノーマル]
これでバンプマッピングが設定され、透過光に波打つような揺らぎがつきます。
ノイズテクスチャの[スケール]は、オブジェクトの大きさに合わせて調整します。
目安としては、ノイズテクスチャの模様の大きさを下の画像くらいに調整すると、透過光の揺らぎがいい具合になります。
これで透過光の色ずれができました。
後は「水やガラスなどの質感」と同じ手順で、光沢シェーダー、フレネル、シェーダーミックスを組み合わせて、反射・光沢を追加します。
仕組みとしてはこれで完成ですが、操作や調整がしやすいように、もう少し工夫します。
IORと色ずれの操作
下の画像のように、屈折シェーダーとフレネルの[IOR]に、値ノードと数式ノードを接続します。
これで、値ノードを調整するだけで、[IOR]と[色ずれの強さ]を操作できるようになります。
IORの値ノードで、屈折率を操作できます。
IORの値を大きくすると、相対的に色ずれの効き具合が弱くなるので、色ずれの値も合わせて調整する必要があります。
色ずれの値ノードで、色ずれの強さを操作できます。
カラーの操作
下の画像のように、屈折シェーダーの[カラー]に、RGBノード、カラー分離、カラー合成を接続します。
拡大図。
これは、RGBノードのカラーを赤・緑・青の成分に分解して、それぞれの屈折シェーダーのカラーに入力する仕組みです。
これで、RGBノードのカラーを設定するだけで、色ずれのカラーを操作できるようになります。
以上で、できあがりです。
CyclesとEEVEEの比較
このマテリアルはEEVEEでも使用できます。
ただし、もともとの屈折表現の違いから、Cyclesとは異なる見た目になります。
参考動画
分光のマテリアルは、こちらの動画を参考にしています。
光学迷彩の作り方
ここまでに作った分光の設定を元に、攻殻機動隊で有名な光学迷彩を作ります。
※Cycles・EEVEEどちらでも使える設定です。
まず光学迷彩で姿を消した状態のマテリアルを設定して、それから「姿が消える」「姿が現れる」アニメーションを作ります。
マテリアルの設定
【1】分光のマテリアルを用意します。
RGBノードのカラーは[白(FFFFFF)]に設定します。
光学迷彩で姿を消した状態の時に、周囲の景色などが映り込むとおかしなことになるので、反射・光沢を解除します。
これで反射・光沢は描画されなくなります。
しかし、全反射になるはずの部分の真っ黒が復活します。
この真っ黒が描画されないようにします。
【3】透過シェーダーを、シェーダーミックスの第2シェーダーに接続します。
【4】ライトパスの[光沢レイ]を、シェーダーミックスの係数に接続します。
これは、屈折のサーフェスが重なり合う場合、カメラから見て一番手前のサーフェスだけを表示して、奥のサーフェスは非表示にする設定です。
これで、カメラから見て奥の面に発生する「全反射になるはずの部分の真っ黒」は表示されなくなります。
また、この設定では一番手前の面の屈折だけが描画される――つまり「屈折の重ね合わせ」が描画されなくなるため、実際のガラスなどに比べて単純な屈折になり、非現実的な、より光学迷彩らしい見た目になります。
次は、IORを調整して光学迷彩の屈折を演出します。
まず、この後の変化が分かりやすいよう、一時的に色ずれを解除します。
【5】色ずれの値ノードを[0]にします。
これで色ずれが解除され、無色透明の屈折になります。
【6】レイヤーウェイト、カラーランプ、範囲マッピングを追加します。
【7】この3つのノードのパラメーターを、次のように設定します。
レイヤーウェイト[ブレンド:0.2]
カラーランプ/黒い方のカラーストップ[位置:0.1]
範囲マッピング[最小へ:0.99、最大へ:1.1]
この3つのノードを、IORの値ノードと入れ替えます。
しかしIORの値ノードからは3本の出力リンクが伸びているので、ひとつひとつ接続し直すのは面倒です。
入れ替えをしやすくするため、このリンクをリルートで束ねます。
【8】下の画像のオレンジの線で、3本のリンクをShift+右ドラッグで横切ります。
これで自動でリルートが追加され、リンクが束ねられます。
では、ノードを入れ替えましょう。
【9】レイヤーウェイト、カラーランプ、範囲マッピングを、次のように接続します。
・[レイヤーウェイト:フレネル]>[カラーランプ:係数]
・[カラーランプ:カラー]>[範囲マッピング:値]
・[範囲マッピング:結果]>[リルート]
これで、オブジェクトの形がうっすら見える程度の屈折になります。
※IORの値ノードは不要になったので削除します。
ここではレイヤーウェイトの出力を下の画像のように変換して、IORを設定しています。
カメラから見た面の向きを元に、全体的なIORが[0.99]、エッジ部分のIORが[1.1]と変換されます。
―― Point ――
ここでは、範囲マッピングの[最小へ]を[0.99]という微妙な値にしています。
これは、[1](屈折なし)にすると下の画像のようにおかしな見た目になってしまうためです。
なぜこのような見た目になるのか、仕組みはよく分かりませんが、この設定では[最小へ]を[1]以外の値にする必要があります。
―――――――
IORが設定できたので、色ずれを追加します。
【10】色ずれの値ノードを[0.01]にします。
これで色ずれが描画されます。
全体的にIORを低めに設定しているので、色ずれの値も元より小さくしています。
仕上げに、透過光の揺らぎを調整します。
分光の設定ではバンプマッピングで透過光の揺らぎを表現しましたが、これを光学迷彩の表現に適した仕組みに変更します。
【11】バンプを削除します。
【12】テクスチャ座標とノイズテクスチャを、下の画像くらいの位置に移動します。
【13】数式ノードを2つ追加します。
片方は[処理:乗算、値 2:0.03]と設定します。
【14】数式ノードを、次のように接続します。
・[範囲マッピング:結果]>[数式(加算):値 1]
・[ノイズテクスチャ:係数]>[数式(乗算):値 1]
・[数式(乗算):値]>[数式(加算):値 2]
・[数式(加算):値]>[リルート]
これで、IORにノイズテクスチャの係数が加算され、透過光に揺らぎがつきます。
ノイズテクスチャの[スケール]は、オブジェクトの大きさに合わせて調整します。
目安としては、ノイズテクスチャの模様の大きさを下の画像くらいに調整すると、透過光の揺らぎがいい具合になります。
※ここではスザンヌのサイズに合わせて、ノイズテクスチャのスケールは[20]に設定しました。
なお、バンプマッピングで揺らぎをつける方法と比較すると、下の画像のようになります。
ちょっと分かりにくいかもしれませんが、バンプマッピングの方は全体的に凹凸が表現されているのに対し、IORに加算する方は色ずれ部分だけ揺らぎが強調され、より機械的なノイズのような見た目になります。
以上で、光学迷彩のマテリアルができあがりました。
では、いよいよ「姿が消える」「姿が現れる」アニメーションを作りましょう。
アニメーションの設定
ここでは見本として、次のような10秒間のアニメーションを設定します。
・0~1秒(0~24フレーム):元の質感
・1~3秒(25~72フレーム):だんだん姿が消えていく
・3~7秒(73~168フレーム):姿が消えている
・7~9秒(169~216フレーム):だんだん姿が現れる
・9~10秒(217~240フレーム):元の質感
では、さっそく作っていきましょう。
まずはIORのアニメーションを設定します。
【1】範囲マッピングのパラメーターに、次のようにキーフレームを打ちます。
・25フレーム 最小へ:1.45、最大へ:1.45(ガラスのIOR)
・72フレーム 最小へ:0.99、最大へ:1.1(光学迷彩のIOR)
・169フレーム 最小へ:0.99、最大へ:1.1(光学迷彩のIOR)
・216フレーム 最小へ:1.45、最大へ:1.45(ガラスのIOR)
これで、ガラスのIOR ⇒ 光学迷彩のIOR ⇒ ガラスのIOR と交互に変化するアニメーションができます。
次に、色ずれのアニメーションを設定します。
【2】色ずれの値ノードに、次のようにキーフレームを打ちます。
・25フレーム 0.1(色ずれ大)
・72フレーム 0.01(色ずれ小)
・169フレーム 0.01(色ずれ小)
・216フレーム 0.1(色ずれ大)
これで、ガラスのIOR/色ずれ大 ⇒ 光学迷彩のIOR/色ずれ小 ⇒ ガラスのIOR/色ずれ大 と交互に変化するアニメーションができます。
次に、透過光の揺らぎを動かすアニメーションを設定します。
【3】ノイズテクスチャのDimensionsを[4D]に切り替えます。
これで、パラメーターに[W]の項目が追加されます。
【4】[W]に、[1フレーム:0、25フレーム:0.1]とキーフレームを打ちます。
【5】グラフエディターでノイズテクスチャのFカーブを表示して、次のように操作します。
Vキー ⇒ [ベクトル]をクリック
Fカーブが直線になり、アニメーションが等速変化になります。Shift + E ⇒ [傾きを保持して外挿]をクリック
キーフレームの前後にFカーブが延長されます。
これで、全フレームを通してノイズテクスチャの模様が変化するようになり、透過光が揺らぎ続けるアニメーションができます。
これで、光学迷彩の設定は完了しました。
仕上げに、「通常の質感」と光学迷彩を切り替えるアニメーションを追加します。
【6】「通常の質感」を用意します。
ここではシンプルに、プリンシプルBSDF単体で設定しました。
【7】「光学迷彩のノードツリー」と「通常の質感」を、シェーダーミックスでミックスします。
シェーダーミックスは次のように接続します。
・第1シェーダー:光学迷彩のノードツリー
・第2シェーダー:通常の質感
【8】シェーダーミックスの係数に、次のようにキーフレームを打ちます。
・25フレーム 1(通常の質感)
・48フレーム 0(光学迷彩)
・193フレーム 0(光学迷彩)
・216フレーム 1(通常の質感)
これで、通常の質感 ⇒ 光学迷彩 ⇒ 通常の質感 と交互に変化するアニメーションができます。
以上で、できあがりです。
―――――――――――――――
ここでは見本として、透明になった後も見えやすい設定にしましたが、各ノードの設定次第で、いろいろな見え方を表現できます。
例えば次のように設定すると、「屈折や揺らぎが少なく、色ずれが無く、透過光が少し暗くなる」ような光学迷彩になります。
他にも、ノイズテクスチャのスケールを調整して透過光の揺らぎを細かくしたり、アニメーションの設定で「衝撃を受けた時に一瞬だけ見える」ようにしたり、ダイナミックペイントと合わせて「攻撃を受けた部分の周辺だけ見える」ようにするなどの使い方もできます。
表現したい演出に合わせて、いろいろな設定を試してください。
影の消し方
ライトパスとシェーダーミックスの間に数式ノードを追加して、[シャドウレイ]と[光沢レイ]を加算すると、影を消すことができます。
CyclesとEEVEEの比較
このマテリアルはCyclesとEEVEEで、ほとんど同じ見た目になります。
これは「全反射になるはずの部分の真っ黒」が表示されないように、カメラから見て一番手前のサーフェスだけを表示して、奥のサーフェスは非表示にする設定にしたためです。
この方法はEEVEEの屈折描画と同じ方式なので、CyclesでもEEVEEとほぼ同じ見た目になります。
【使用した3Dモデル】
Material ball in 3D-Coat - Download Free 3D model by 3d-coat (@3d-coat) [a6bdf1d] - Sketchfab is licensed under Creative Commons Attribution
よろしければサポートお願いします。いただいたサポートは次の記事の制作費になります。