チュートリアル / 宋さんの3ds Max キッチンスタジアム
第28回:フレネル
- 3ds Max
- コラム
- チュートリアル
- マテリアル・シェーダー・UV
- 中級者
- 建築・製造・広告
- 映画・TV
3D CGの学校を卒業された方、CGの解説本などを使って独学で学んできた方々など、CGツールを使って作品を作成されている方々であれば一度はこの言葉「フレネル」を聞いたことがあると思います。キッチンスタジアムの初期のコラムでもフレネルに関してはすでに解説させてもらいました。ここではこの「フレネル」という現象をもう一歩踏み込んで説明していきましょう。
フレネルはカメラからのレイが物体にヒットする入射角度が浅ければ浅いほど反射率が高くなるというものでしたよね、そこでこんな実験をしてみました。3種類の球体を配置してそれぞれIORの設定値のみ変化させたものです。
上図は左からIOR1.2、1.5、2.5に設定しました。フレネルの法則にしたがってIORの値が高いほど中央部の反射率が高くなっていることがわかります。ただし注目していただきたいのは下図の各球体のエッジ部分の反射率です。
IORの設定値が異なりますがエッジ部分の反射レベルは3つともほぼ同じです。しかし、この3つのシェーダーには異なるIORを設定しているはずです。なぜエッジ部分はどれも反射率が高いのでしょうか?
IORの値に対する反射率の変化をグラフにまとめてみました。
ここで注意したいのは、 光(レイ)の反射角度が90度の地点では一律 反射率が最大になるということです。これはゴムであろうと木材であろうと金属であろうとすべての素材でこの特性を示します。
金属の場合は前項のメタルの話で触れたように、金属の種類によって反射の色に変化が起きます。正確にはRGBのレベルで反射率が変化しますが例の角度が90度に達するエッジ部分ではすべて100%の反射率になります。 値を管理するガンマ係数にもよってはこれらのカーブは変化しますので注意してください。
ともあれ、フレネル カーブをコントロールすれば物体の反射率が制御できるよ、ということです。 ただし、IORに関しては以前のコラムでも書きましたが物体の種類によって数値で定義されていますので、あまり極端に変えてしまうのも少々問題がおきる場合があります。
この辺の問題を表すサンプルとして簡単なマテリアルを作成して実験してみました。
このレンダリングサンプルは、左から順に
IOR 1.2程度 粗さ(Roughness)0.1
IOR 2.5程度 粗さ(Roughness)0.1
IOR 1.2程度 粗さ(Roughness)0.1 + コーティングIOR 2.0
一番右端の球体は、ベースシェーダ―のIORは左と同じにしていますが、さらにコーティングというものを施しています。これについては後程 解説しましょう。
レンダリング画像を見ると、自然な表現としては一番左と右端の設定ではないでしょうか? 真ん中は木材というより、木目のプリントをしたビニールシートのような質感です。 絵作り上 どうしても故意に反射率を上げたい という場合もありますが、不用意にIORを上げてしまうと現実の物質とは食い違う表情を出してしまうことがあるわけです。
でも大丈夫!
フィジカルマテリアルには便利な機能が実装されています。
コーティング パラメータというロールアウトを使って、仕上げ材として塗布するニス効果やコーティング効果を演出する機能です。上図の一番右端は、そのコーティング設定を行っているものです。真ん中の球体よりより自然ですよね、
この機能を使うことでベースの質感はあくまでも素材が持つ特性に合わせてIORを決定し、コーティング剤として表面を別のパラメータで設定できます。車のペイントで使われるクリヤ塗装や、磁気製品で使う釉薬、またはワックスでコーティングされたフローリングも表現できますね。
一番右端の球体に関してレンダリング画像を見るとこの球体だけ若干暗い色調であるのがわかりますね。なぜでしょうか?
この設定ではコーディング用のIORに2.0という設定をしています。本コラムの冒頭で光の反射は拡散反射、鏡面反射、吸収・透過、熱に変換 を全て合わせると入射する光の値になると書きました。
つまり、クリヤコートを通過する光エネルギーが鏡面反射で減少するからです。とはいえベースマテリアルの色をある程度は活かしたいという場合もありますので、その辺はコントロールができるようにしています。
上図のレンダリングサンプルではフィジカル マテリアル 内の[下位に影響を与える]グループの設定で、カラーのレベルを左から 0.0, 0.5, 1.0 と設定しています。クリヤコートの影響をどこまでベースシェーダに影響させるかを調整させています。
ここでの[粗さ(Roughness)]の値はクリヤコートで定義した[粗さ(Roughness)]の値をベースシェーダ―にどのように伝えるかの設定です。表面の塗料に[粗さ(Roughness)]が設定されていれば、そこを通過した光は拡散されますので、ベースシェーダでの[粗さ(Roughness)]の値は増幅してしまいます。ただし、場合によってはベースシェーダ―の表現にあまり影響が出ない方がいい場合もありますので、適時 様子を見てこのパラメータを調節するようにしてください。
コーディングパラメータではそれ独自のIOR設定やバンプ設定、そのレベルを調節するマップなどを使うことが出来ますので、水滴に付いたコップやコーティングがはがれた古びた塗板のような表現も可能でしょう。
フィジカル マテリアルにはもう一つ便利なモードが用意されています。
既定の設定では“標準”モード に設定されていますが、マテリアル エディター上部にある[マテリアル モード]を切り替えることにより“拡張”モード を選ぶことができます。
このモードではベース カラー パラメータ内にあった[メタル質]や[IOR]の設定が、“反射”グループ内に移動し、反射要素だけの編集が可能になります。物理的なコントロールだけではなくもう少しマニュアルでマテリアルの編集を行いたい場合に便利です。
いろいろな設定が可能にはなっていますが、通常フォトリアルな物体の表現をするだけであれば、“標準”モードのみで十分作品を作り上げることが出来ると思います。
ただし、マイクロサーフェイスの箇所でもの述べましたが、実世界の物体の表面属性はとても複雑で、様々な要素が入っていますね。
ではマイクロサーフェイスの設枚の時に使ったボーリングボールのサンプルを利用して、この花崗岩のマテリアルをボールに割り当ててみると、平面にマップした時とは異なり、もう少し質感を追い込んだ方が良いことに気付きます。
本来は石のIORを決めればいいわけですが、花崗岩のような様々な鉱石が混じっていると場所によってIORが変わってくることがあります。本来であればIORにマスクマップを適用するべきですが、実際にやろうとするとかなりレンジの広い32bit画像を使う必要が出てきます。また、IORの値とグレースケールの画像データの値の整合性をとる必要もあり、とても面倒な設定が必要になるでしょう。