Tips

実験と検証 / Try & Memo編

マテリアルについて(反射と屈折)

まえおき

Poserのマテリアル設定で、まず最初によくわからないと思われるのが「反射」と「屈折」ではないでしょうか? 鏡のような反射物はレイトレースを使用しないと表現出来ないと言われますが、ただレンダリングオプションでレイトレースを指定しただけは使えません。レイトレースの効果を得るには、正しくマテリアルを設定する必要があります。

また、レイトレースを使用しなくても反射しているように見える材質もありますが、それらとレイトレース反射の違いはなんでしょうか?

鏡や水、宝石類をそれらしく表現するには?

というわけで、反射と屈折について少々まとめてみました。

おさらい

図01
図1:反射と屈折(再掲)

マテリアルについて/ルートノードで、反射と屈折は接続されたノードの情報を、そのまま加算するものだと説明しました。それぞれ、加算後に陰影付けされるか、陰影付け後に加算されるかという違いがあります。

ではまず、反射について見ていきましょう。

反射マップによる反射表現

反射率の高い材質を表現するには、反射マップによる反射を利用する方法と、レイトレース反射を使用する方法の二通りがあります。

反射マップによる反射は、反射ノードにイメージファイルを接続して、物体表面にそのイメージが映り込んでいるように見せる方法です。それに対し、レイトレース反射は、レイトレーシングというレンダリング手法を使用することによって、実際に周囲の物体を映り込ませる方法です。

図2
図2:反射マップの接続方法
反射マップの使用

反射マップの基本的な接続方法は次のようになります。

ルートノードの反射色に球体マップ(新規ノード>ライト>環境マップ)を接続し、そのカラーにイメージマップ(新規ノード>2Dテクスチャ)を接続します。そして、イメージマップのイメージソースに、映り込ませたい反射イメージを読み込みます。適当なファイルがない場合は、Runtime下のReflection Mapsフォルダにあるデフォルトの反射マップを読み込んでみましょう。

図3
図3:反射マップによる映り込みの違い

映り込みに使用するイメージファイルによって、材質やそのオブジェクトが置かれている環境が異なっているように見えます。

ここでは、球体マップノードを間に挟むことで、イメージを歪ませています。この球体マップノードはどのような役割を果たしているのでしょうか。

図4
図4:球体マップなしの反射

試しに球体マップノードを使用せずに接続してみます。

球体マップノードが存在しないと、反射イメージがそのままUVマッピングされるているだけだということがわかります。

図5
図5:球体マップによる変形(左なし・右あり)

変形具合を確認するため、球体マップを拡散色ノードに繋いでみました。

図6
図6:不自然な反射の例
反射マップの使いどころ

反射マップによる反射は、あくまで疑似的な表現でしかありません。したがって、一見反射率の高い素材であっても、近隣のオブジェクトが映り込むわけではないので、キャラクターのポーズなどシーンの状況によっては不自然に見えてしまいます。また、シーンの背景と異なる反射マップを使用していると、明らかに浮いてしまいます。

しかし、手軽に素材感を表現できること、時間のかかるレイトレースを使用しないためレンダリング時間が短縮できるといったメリットがあります。また、PoserがレイトレースをサポートしたのはP5以降ですが、反射マップはP4以前のバージョンでも使用できます。

図7
図7:反射マップに向いている形状
反射マップの長所
・レイトレースを使用しないのでレンダリング時間が短縮できる
・イメージファイルによって手軽に素材感を変更できる
・以前のバージョンでも使用できる
反射マップの短所
・シーンやポーズによっては写り込みが不自然になる
・質感はイメージファイルのクオリティに依存する

したがって反射マップによる反射は、鈍い光沢の金属物や小さめの形状、またはラテックス素材の服のようにオブジェクトの凹凸が激しく、映り込むイメージがある程度変形するものなどに向いていると言えるでしょう。

レイトレース反射

図8
図8:反射ノードの接続方法

レイトレースによる反射は、視点から見える光を追跡するというレイトレーシングによって、シーン内に実際に存在するオブジェクトを描画します。レイトレース反射の基本的な接続方法は次のようになります。

反射ノードに反射(新規ノード>ライト>レイトレース)を接続します。また、レンダリングオプション画面で「レイトレーシング」にチェックを入れます。

反射ノードのパラメータ

図9
図9:背景の色による違い
背景

シーンの何も存在しない場所の色(背景)を指定します。このノードにイメージマップを接続することもできます。通常は背景色をスポイトツールで拾ってやるとよいでしょう。マテリアルルームに標準のWacroを使用して反射をセッティングすると、背景にBGカラーノードが接続されています。

図10
図10:品質
品質

レイトレースの品質を指定します。品質を上げるとレンダリング時間が増大します。

図11
図11:柔らかさ
柔らかさ

映り込みをぼかします。値が大きいほどボケが強くなります。ボケがざらざらしている時は、品質を上げると綺麗になりますが、さらにレンダリング時間が増大します。

レイバイアス

レイバイアスは、反射表面から設定された距離の分だけレイトレースの計算を省略します。したがってレイバイアスの範囲内に存在するオブジェクトは反射像に映りません。これはディスプレイスメントを使用する際に生じる問題を回避するためのパラメータで、非常に微妙な角度の凹凸の計算を省略することができます。

図12
図12:反射物に奇妙な斑点が現れた場合は、レイバイアスの値を大きく設定する

反射を設定したオブジェクトが凹面・非平面ポリゴンなどを持っている場合、平面が自分自身の影になってしまい反射に不正な(というか意図しない)結果が出てしまうことがあります。その場合、このレイバイアスの値をある程度上げることで回避することができます。

数値は距離(単位は環境設定による)です。

その他のパラメータ

反射色と反射値

反射色は、レイトレースで計算された反射像に対し、指定された色を乗算することで着色します。

反射値は反射の強さを指定します。反射色で乗算された結果にさらにこの値を掛けたものが、最終的な反射としてオブジェクトの表面に加算されます。

図13
図13:レイトレースバウンズによる合わせ鏡
レイトレースバウンズ

光が何回まで反射するかをレンダリングオプション画面で設定します。レイトレースバウンズを超えると、反射物は光を反射せずに、ただオブジェクトの拡散色が描画されます。

合わせ鏡など、何度も反射するものがある場合はこの値を必要なだけ増やします。ただし、当然ながらレンダリング時間は増大します。

レイトレース反射の使いどころ

レイトレース反射は正確な反射像が描画できる反面、レンダリング時間が増大します。また、正確であるがゆえに、それなりの反射像に見せるためには、映り込む周囲のオブジェクトまで用意しないといけないという欠点があります。

レイトレースの長所
・自然な映り込みを描画できる
レイトレースの短所
・レイトレースを使用するためレンダリング時間が長くなる
・反射物の形状によっては、パラメータ設定と調整が必要
・単独では反射像がそっけない

以上のことから、レイトレース反射は本当に周辺のオブジェクトを映り込ませたいような場合に使用し、金属やエナメルなどの材質感を表現したいなら反射マップによる反射を使用するように使い分けるとよいと思われます。

説得力のあるかもしれない反射設定

レイトレース反射のセッティング方法はわかったけれど、自分で設定するとどうもリアリティが無いような気がする……そんな時は、基本に立ち返って反射を物理的に考えてみましょう。

拡散+鏡面+反射<入射光
図14
図14:ライトと物質の反射と拡散光

そもそも反射というのは、物質に当たった光が表面で跳ね返ったものです。ですから、反射光は入射光より明るくなることは通常はありません。

ところが、Poserサーフェスノードの反射は、接続された内容をそのまま「加算」してしまいます。したがって、拡散値と反射値に注意しないとライトの光量以上に表面が光を発していることになってしまいます。

図14において、ライトから発せられた光が物質表面に当たると、そのまま反射したものが反射光、表面の凹凸によって乱反射したものが拡散反射光になります。その他、特定の色は物質そのものに吸収されてしまいます。実際にはもうちょっと違ったりもしますが、単純化したモデルだということで勘弁して下さい。

さて。ということは、直接反射光と拡散反射光、そして吸収される成分の総和は、ライトの光量に等しいということがわかります。

本当は黒い!?鏡
図15
図15:鏡のマテリアル

反射値が1であるとき、物質は全ての光を反射しています。全ての光を反射しているということは、拡散反射光や吸収される成分は0であるはずです。つまり、「全ての光を反射する物質の拡散値は0である」ということになります。もし拡散値が0よりも大きい値なら、その物質は当たった光以上の光を発していることになってしまいます。

鏡のような反射率の非常に高い材質は、拡散値を非常に低く設定します。実際には鏡であっても全ての光を反射するわけではなく、僅かに吸収されたりしますので、その辺りを考慮して反射値は0.9付近に、拡散値は0.05にして、拡散色にガラスっぽい色を設定します。残りの0.05は吸収された成分ということにします。

図16
図16:色のついたモデルの場合

反射する物質自体に色が付いているものはどうでしょう。この場合も、図14と同様に考えます。違うのは、特定の色の成分が吸収されるということだけです。

拡散色に物質の色を設定し、拡散値と反射値の合計が1を超えないように設定します。このとき、反射色に拡散色と同じ色を指定すると材質感が変わります。

ぴかぴかに磨かれた赤い車があったとします。拡散色にその車の色を設定し、反射値は低めに設定します。若干反射色に拡散色と同じ色をまぜるとよいでしょう。

鏡面値について

ここまで来たら、鏡面値はどう設定すればいいのか? ということに思い至ると思います。鏡面値とはそもそも何でしょうか?

実際の手元にあるガラスのコップやプラスチックのマウスなどを見てみましょう。映り込んでいるハイライトは、よく見ると蛍光灯や窓の形をしているのではないでしょうか。現実の物質に表れるハイライトは、表面の凹凸や反射率によって見え方は違うものの、すべて光源(照明や窓、壁からの拡散光など)が反射して見えているものなのです。

つまり言い換えると、現実には鏡面値に相当するものはないのです。3DCGにおいてレイトレース反射が困難であったころ、疑似的に光源の映り込みを表現するために考え出されたのが鏡面値とハイライトなのです。

図17
図17:表面と中身が違う材質例

ではレイトレース反射を使えば鏡面反射は必要ないのでしょうか。ところがそう簡単にはいかないもので、3DCGでは、光源(ライト)はレンダリングされない=反射像に表れないのです。もちろん光源の位置に照明の形状を用意し、環境値を1にでも設定して映り込ませれば、よりリアルなハイライトが表現できるでしょう。が、すべての光源においてそのような設定をするのは非常に困難です。したがって、鏡面反射はレイトレース反射にライトの映り込みをプラスするものと考えると良いでしょう。

鏡面値は反射値と同じに、鏡面色も反射色と同じに設定します。反射率が高く、反射像がくっきり見えるということは、光源(照明)もくっきり見えるということです。ハイライトのサイズはできるだけ小さめにしてやるとよいでしょう。

逆に一致させなければ、表面と内部が違う材質であるような物体を表現することができるでしょう。

図18
図18:レイトレース反射+反射マップの接続方法と効果
背景マップの活用

レイトレース反射を使いたいけれど、実際に使うと映り込むオブジェクトが少なくてなんだか淋しい感じになってしまう……。そういうときは、反射ノードの背景に反射マップを接続しましょう。背景部分に反射マップが適用されるので、充分な映り込みが得られます。

屈折ノード

図19
図19:屈折ノードの接続方法

水や氷、ガラスといった透明な物体を表現するには、屈折ノードを使います。もちろん屈折率が1のものは透明度を上げれば透明な物体の表現はできますが、屈折ノードを使った方がよい結果が得られます。

屈折ノードは図19のように接続します。

屈折ノードに屈折(新規ノード>ライト>レイトレース)を接続します。また、レンダリングオプション画面で「レイトレーシング」にチェックを入れます。

注意しなければならないのは、透明な物体でも、透明度は0にしなければならないということです。また、反射と同様、拡散値は低めに設定すると良いでしょう。

屈折ノードのパラメータ

背景

反射ノードと同様、シーンの何も存在しない場所の色(背景)を指定します。イメージマップノードなどを接続することもできます。通常は背景色をスポイトツールで拾ってやるとよいでしょう。マテリアルルームに標準のWacroを使用して屈折をセッティングすると、背景にBGカラーノードが接続されています。

表:おもな物質の屈折率
物質 屈折率
1.333
1.309
ガラス 1.43〜1.74
水晶 1.544
サファイア 1.768
ダイアモンド 2.41
屈折_インデックス

屈折率を指定します。屈折率は物質によって固有のものです。詳しくは理科の教科書かインターネットなどで調べることができると思います。

品質

レイトレースの品質を指定します。品質を上げるとレンダリング時間が増大します。

柔らかさ

透過像をぼかします。値が大きいほどボケが強くなります。

透過像がざらざらしている時は、品質を上げると綺麗になりますが、さらにレンダリング時間が増大します。

その他のパラメータ

図20
図20:屈折値と屈折色
屈折値と屈折色

屈折色は、レイトレースで計算された透過像に対し、指定された色を乗算することで着色します。屈折値は透過の強さ、つまり透明度を指定します。

屈折色で乗算された結果にさらにこの値を掛けたものが、最終的な透過像としてオブジェクトの表面に加算されます。

図21
図21:レイトレースバウンズによる屈折の違い
レイトレースバウンズ

光が何回まで屈折するかをレンダリングオプション画面で設定します。レイトレースバウンズを超えると、オブジェクトは光を透過せずに、ただオブジェクトの拡散色が描画されます。

ダイヤモンドなど、何度も屈折と反射を繰り返すものがある場合は、この値を必要なだけ増やします。ただし、当然ながらレンダリング時間は増大します。

説得力のあるかもしれない屈折設定

拡散+反射+屈折<入射光

レイトレース反射の項で考えた入射光と反射色の関係を、屈折にも当て嵌めて考えてみましょう。

図22
図22:ライトと物質の反射・屈折と拡散光

光を透過する物質の場合、表面に当たった光は大部分が物質内部を直進します。透過像が明確に見えるようにするためには、物質の表面が平滑でなければなりません(表面に細かな凹凸があると、曇りガラスのようになってしまいます)。表面が平滑であるので、拡散光はほとんど発生しません。

また、反射光と屈折光の他に、物質内部で吸収される成分が存在します。この成分が透明な物質の色を決定します。無色の透明体の場合、吸収される成分はほとんどありませんが、例えばサファイアのように青く透明な物質は、赤と緑の光の成分を内部で吸収します。

したがって、反射値と屈折値の和が1になるようにし、拡散値は0、物質の色を屈折色で設定するとよいことがわかります。

ワイングラス

まず拡散値はゼロ、屈折ノードの屈折_インデックス(屈折率)はガラスの1.5程度にします。また、屈折色にグラスの色をごくわずかに乗せます。形状が複雑なので、レイトレースバウンズを高目の4にします。グラスの光沢を表すために、鏡面反射色は白、鏡面反射値は1にして、ハイライトサイズを小さく鋭くします。代替鏡面で光沢ノードを使用しても良いでしょう。

図23
図23:氷

拡散値はゼロ、屈折ノードの屈折_インデックス(屈折率)は氷の1.30にします。氷の表面にはわずかな凹凸があり、透過像は歪んで見えますので、これをバンプに3Dテクスチャを接続することで表現します。また、氷の表面は空気中の水分が凍結し、曇って見えます。これは物質の表面が視線と平行になるほど(傾きが強くなるほど)顕著になりますので、環境色にエッジブレンドを接続し、さらにムラを3Dテクスチャに接続することで表現します。

環境色を使用していますので、シーン全体が暗くなるとその部分だけが明るくなってしまいます。周囲に合わせて明るさは調節してください。

反射と屈折の組み合わせ─フレネルノード

フレネル反射
図24
図24:フレネル反射の図

プールや川、そして海に行った時、水面の様子をよく観察してみましょう。自分の足元の水面は比較的水中の様子がよく見えますが、遠くの水面は水平線に近くなればなるほど、空を反射して水中が見えなくなります。これはフレネル反射と呼ばれる現象です。

透明な物質に光があたると、光は屈折しながら物質の内部を直進しますが、一部は物質の表面で反射します。この反射光と屈折光の割合は、物質の持つ屈折率と光の当たる角度によって決定します。物質に対して垂直に近い角度で入射すると、反射よりも物質内部に進む光の方が多くなりますが、平行に近い角度になると反射の方が強くなります。

図25
図25:フレネルノードの接続方法
フレネルノードの使用

Poserでも、この現象を再現することができます。屈折ノードにフレネル(新規ノード>ライト>レイトレース)を接続し、レンダリングオプション画面で「レイトレーシング」にチェックを入れます。項目は屈折と同じように設定します。

説得力のあるかもしれないフレネル設定

図26
図26:フレネルを使用したグラス
ガラスのコップ

先程屈折の項で使用したガラスのマテリアルの、屈折をフレネルに変更してみます。エッジに近付くほど周囲を反射します。

揺らぐ水面
図27
図27:水面

拡散値は0、屈折ノードにフレネルを接続し、屈折率は水の1.33にします。また、水は長い波長の成分をわずかに吸収するため、屈折色に水色を設定します。また、揺らぐ水面を表現するために、バンプに3Dテクスチャを接続します。

重要なのは反射像です。プールであれ海であれ、水面は空の色を反射しています。フレネルの背景ノードに明るい空のテクスチャ、または雲模様を表現した3Dテクスチャノードを接続します。また、太陽などの光源が直接反射するため、鏡面反射を追加します。

水面を通過した光はさざ波の角度によって複雑に屈折し、水底に模様を描き出します。コースティクスと呼ばれる現象ですが、Poserはまだコースティクスを表現することはできません。そこで、3Dテクスチャを環境色に接続して、水底に現れる模様を疑似的に表現しました。ここでは水底にしか適用していませんが、水中の物体にも同じように適用するといっそうそれらしく見えるでしょう。

図28
図28:宝石
宝石

拡散値は0、屈折ノードにフレネルを接続し、屈折率をその物質の屈折率にします。また屈折色でその宝石の色を指定します。表面に写り込む内容も、質感にとっては重要な要素ですので、周囲にそれらしい材質設定をしたものを配置するとよいでしょう。そして鏡面反射を強く大きめに、スムースシェーディングがからないように角度を小さく設定します。

また、宝石の輝きの最大の要素は、高い屈折率による入射光の内部反射です。PoserのFireflyレンダラはそのままではポリゴンの裏面の鏡面反射を描画しませんので、ノーマル_前にチェックを入れて内側の反射を有効にします。さらに、より本物に近い輝きに近づけるなら、光源を複数配置したり、鏡面反射だけを持った一回り小さい透明な物質を宝石の中に配置したりといった、なんらかの工夫が必要になるでしょう。

ちょっぴり信頼の置けない問題点

実は反射に繋がなくても機能する

レイトレース反射は反射色に、屈折やフレネルは屈折色のノードに接続すると説明しました。しかしルートノードの回で説明したように、反射ノードも屈折ノードも他のノードと同様、接続された内容を加算しているだけにすぎません。したがって、反射や屈折を別のノードに接続しても実は正常に描画されるのです。いわばレイトレースシェーディングといったところでしょうか。もちろん、あまりお勧めはできません。

反射像が途切れてしまう……
図29
図29:反射像が途切れるケース

実際にレイトレース反射を使ってみると、反射像が途中で切れてしまうことがあります。これは、Fireflyレンダラがシャドウマップを計算するときに、(反射がない状態で)カメラに影が入らない範囲のオブジェクトをクリッピングしてしまう為に起こります。この処理によってシャドウマップの計算を短縮しているのですが、レイトレース反射を行う時には支障が出ます。この問題はPoser 5時代から指摘されていますが、現行最新バージョンでも解決していません。

この問題を回避するためには、シャドウマップではなくレイトレースシャドウを使用するか、影の描画をしないか、またはクリッピングが行われないようなオブジェクトの配置を心がけるなどの工夫が必要になります。

まとめ

レイトレース反射も屈折も、レンダリングに時間がかかるという理由でなかなか使用されておらず、そのためいざ実際に使ったときに、思うような効果が得られないという方もいらっしゃるかもしれません。しかし、簡単な光の性質を押さえてさえいれば、設定はそれほど難しいものではありません。また、ちょっとした工夫を加えれば、幅広い表現を追求できると思います。

▲ Tipsタイトルに戻る
◆ ホームに戻る