見出し画像

blender 4.5 シェーダー実験室 - 光の反射

あたりまえですが、光のなにもないところではなにもみえません。なにかモノをみるということは、どこからか光がそのモノに当たって反射し、目に届くからで、3DCG でもそれはほぼ同じです。ここでは、blender での主要なふたつの光の反射である、鏡面反射、および、拡散反射について、すこし整理してみます。cycles でレンダリングを行います。


環境 Blender 4.5.0 , Mac Mini M1 OS 14.4



拡散反射と鏡面反射


光がモノに届くと、一部はその表面下で全方向に拡散して反射する。これを拡散反射光(Diffuse - ディフューズ)と呼び、一部は表面で、一定の角度で跳ね返る。これを鏡面反射光(Specular - スペキュラ)と呼ぶ。

blender でオブジェクトが描画されるとき、おもにこのふたつの反射光をもとにモノのみえかたを再現している。たとえば、赤いリンゴのオブジェクトが赤いのは、拡散反射光の再現で、一部で光が反射して光沢となってみえるのは、鏡面反射光の再現だ。

鏡面反射はモノの表面上で起こり、拡散反射光はやや表面下で起こる。リンゴの赤い皮は薄いし、スプレーなどの塗料膜も極薄なので、ごく表面に近いところで反射するのだろう。
なお、それよりも深いところで反射する光は、シェーダーのサブサーフェスで再現する、表面下散乱(サブサーフェススキャタリング)光で、本来は異なる反射光だが、blender では拡散反射光の一部として扱われるようだ。

実際にレンダリングで確認してみよう。

下のように、球、床、左からのエリアライトを設置し、光はエリアライトからのみとし、背景光はゼロとした。

球と床のマテリアルはデフォルトのプリンシプル BSDFから 粗さを 0.2 に変更
cycles によるレンダープレビュー

エリアライトを選択し、オブジェクトプロパティ > 可視性 > レイの可視性 のディフューズ(拡散反射)、光沢(スペキュラ、鏡面反射)を一時的に OFF にし、ディフューズ、光沢のみの状態にしてみる。

光沢を OFF とし、ディフューズのみのレンダリング

ディフューズを OFF とし、光沢のみのレンダリング

このように、どちらかのみを抽出すると、ディフューズではマテリアルの色と光による濃淡、光沢では、床や球にできている鏡面反射が表現されていることがわかる。


ディフューズの調整


ディフューズは、おもにオブジェクトの表面色を表現する機能なので、ディフューズの調整とは、ほぼベースカラーでの調整になる。上の操作で、光沢を OFF とし、「ディフューズ」のみのレンダリングで確認する。

粗さ、IOR の値を変化させても、顕著な違いがない。これらの値は鏡面反射(光沢)に関わる設定値だからだ。なお、メタリックの値を 1.0 とすると、なにも表示されなくなるのがわかる。メタリック(金属)物質にはディフューズによる拡散反射はまったく起こらず、鏡面反射のみになるためだ。

マテリアルのベースカラーを明るい青に変更
マテリアルのベースカラーを暗い青に変更
エリアライトのカラー、および、マテリアルのベースカラーを変更

ディフューズの表現は、ベースカラーの設定、とくに明暗の調整によって大きく変化する。また、ディフューズの場合、ライトの光の色も影響を与え、それらの組み合わせでまた表情も大きく変わる。


スペキュラの調整


続いて、鏡面反射についても確認する。上述の操作で、ディフューズを OFF とし、「光沢」のみのレンダリングで確認する。鏡面反射は、おもに、「粗さ」、「IOR」、および「メタリック」で調整できる。

光沢のみのレンダリングで、マテリアルのベースカラーを変化させても光沢に大きな影響がないことがわかるだろう。鏡面反射にはモノの色(ベースカラー)が反映されないからだ。

粗さ

表面のなめらかさを表す値。ゼロで、鏡のような表面になり、もっとも反射も強い。値が大きいほど表面が粗く乱反射が増え、反射が弱く、また、反射の範囲が広がり、やわらかな印象になる。

粗さ 0.0
粗さ 0.5

IOR

IOR は物質の屈折率を表す値で、大きいほど鏡面反射が強く、広い範囲に反射が及ぶ。1.0 が最低の値で真空と同じ(なにも反射しない)、通常の物質の最大値はおおよそ3.0程で、もっともIORが高い物質のひとつ、ダイアモンドは 2.5程度。

粗さ 0.2 IOR 1.1
粗さ 0.2 IOR 2.5

より広い範囲に強い光沢を出したい、という場合に IOR の操作は有効だ。

メタリック

その物質が「金属であるかどうか」を表す値で、通常の金属物質は、メタリックの値 1.0 。金属物質は性質として強い鏡面反射率をもっている。

メタリック 1.0 粗さ 0.0
(この組み合わせは、もっとも鏡面反射、光沢の強いマテリアルといえるだろう)

なお、マテリアルのベースカラーは鏡面反射のカラーにほぼ影響を与えないが、もちろん、ライトのカラーはダイレクトに反映される。下は、エリアライトのカラーをグリーンに変更した場合。


直接光、間接光


ちなみに、エリアライトのレイの可視性の操作、「ディフューズ」のみレンダリングしたパターンで、床に球が映り込んでいるのがわかる。このような鏡にあるような映り込みは、文字通り鏡面反射(光沢)によるもので、ディフューズによるものではないはずだ。

ではなぜ、ここにレンダリングされているのか。

これは、エリアライトの分担は、ライトが直接照らす「直接光」に限られ、球にあたって跳ね返った「間接光」は、球が発しているとみなされるからだ。


このため、間接光を発しているとみなされる球オブジェクトの、レイの可視性 > 光沢 を OFF にすることで、床への映り込み(鏡面反射)はレンダリングされない。

このように、ライトからの直接光と、他のオブジェクトなどに跳ね返ってできた間接光は、レンダリング上、役割が異なり、ディフューズ、スペキュラともにそれぞれ同様だ。blender ではこれらを別に抽出し、レンダリングすることもできる。
やや高度な画像処理になるが、それぞれをレイヤーとして別個に調整し、合成する、というような操作も可能になる。


ライトパスの出力


ここでは、ディフューズ、スペキュラーそれぞれの、直接、間接光の影響を別個にライトパスとして出力する。

通常のレンダリング

ビューレイヤープロパティを表示し、ディフューズ、光沢 の各直接照明、間接照明にチェックを入れる。

  • レンダー > 画像をレンダリング でレンダリングを行う

  • Compositing ワークスペースに変更、「ノードを使用」にチェック

レンダーレイヤーノードの、「DiffDir(ディフューズ直接)」、「DiffInd(ディフューズ間接)」、「GlossDir(光沢直接)」、「GlossInd(光沢間接)」から接続することで、それぞれのレンダリング結果を確認できる。

DiffDir ディフューズ直接光
DiffInd ディフューズ間接光
GlossDir 光沢直接光
GlossInd 光沢間接光

ある程度のスキルがあれば、これらを補正、加工して実用的、あるいはアーティスティックな画像補正、加工ができるし、そうでなくても、CG でシェーディングがどのように行われているのか確認するだけでもスキルアップの一助にはなるだろう。


参考


まとめ


別にこんなこむつかしいことを考えなくても、きちんとレンダリングはできるし、自分には必要ないかな、などと思わず、すこし頭に入れておいておくのも損にはなりません。
なぜこんなところに映り込みが、なぜこんなに光沢がきつい(少ない)のだ、などと悩んだときに、ある程度、役立ちます。


以前は、テーブルのうえに金属オブジェクトをのせると、金属の半分近くにテーブルの表面が映ってしまい、なんだろうこれは、エラーかな、と思ってました。物理的に正しい現象なんですね。いまではある程度、どこをどうごまかせるのか(そういう映り込みを減らすとか)、見当がつくようになりました。知識とはありがたいものだと思います。

いいなと思ったら応援しよう!