ノーダルシェーディング(レイキャスト編):映り込みの薄さを調節するには
https://www.youtube.com/watch?v=eucjp1TZbMo&hd=1
今回は、映り込みの濃淡を調節する方法を例にとって、MODO 801から追加されたレイキャストというノードについて解説していきます。
サンプルとなるシーンにはシンプルに、球体と床のメッシュだけが配置されています。ここで床のメッシュに対して球体を映り込ませてみましょう。通常であればシェーダツリーで反射などを行えば、鏡のような効果もすぐに出すことができますが、今回はレイキャストノードを使用してみます。
まずは床のマテリアルをスケマティックビューへとドラッグアンドドロップします。さらに追加ポップアップ > シェーダ入力 > レイキャストノードを追加してみます。このレイキャストノードによってどのような情報を取得できるのかというと、ある位置からある方向に対して一本のレイを放射した時に、そのレイが衝突した個所の位置や法線、色、不透明度、その箇所までの距離を取得することができます。
レイキャストノードを追加すると、デフォルトでシェーダ入力ノードからそれぞれ起点と方向に接続が行われています。これはシェーディングされる各サンプルの位置、さらにその位置における法線を元にレイを放射するということです。
まずは単純に、レイキャストノードのヒットした色を、マテリアルのディフューズの色へと接続してみましょう。色のデータですので当然RGBという三つのチャンネルがあり、接続先のRGBチャンネルに対して、それぞれ接続する必要がありますが、MODO 801からはこの接続を簡単に行えるようにするため、ひとつひとつを接続するのではなく、折りたたんだ状態の色情報をそのまま接続できるようになっています。折りたたんだ状態で接続することにより、中にある三つのチャンネルが一度に接続されるようになっています。これはRGBの色情報だけでなく、XYZの位置や回転情報に対しても、同様の操作が可能であり、スケマティックビューでのワークフロー効率化が図られています。
このようにして、ヒットした色をディフューズの色へと接続してみると、床面には鏡のように球体が映し出されています。これはシェーディングしたサンプル箇所、つまり床面から、シェーディング法線、つまり床のジオメトリの法線、この場合、Y軸に対して上向きに向かっている法線方向に各サンプルからレイを放射した時に、ちょうど球体にヒットする床面の領域に対して、球体の色が映し出されているということになります。
試しに球体を少し動かしてみましょう。プレビュービューポートの上でショートカットキーWで移動ツールを起動します。すると、プレビュー画面にハンドルが移動ツールの表示されるようになりました。これもノーダルシェーディングの設定などが行いやすいように、MODO 801から追加された点です。直接プレビュービューポートでトランスフォームを行えるようになりましたので、3Dビューへと移動する必要はありません。
球体を動かすにつれ、床面も映り込んだ箇所が移動しているのがわかります。
レイキャストノードではさらに、ヒットした距離の情報も取得できますので、今度はヒットした距離を元に、距離が遠くなるとこの映り込みが薄くなり、距離が近くなると映り込みを濃くする設定を行ってみます。今回は801から新たに追加された色を編集するためのノードを組み合わせて、表現してみます。
まず、追加ポップアップ > チャンネルモディファイヤ > 色 > カラーブレンドというノードを追加します。このノードは、二つの色を入力し、入力されたマスクに沿って、色を出力するというノードになっています。まずはこのカラーブレンドノードの入力カラー1にレイキャストノードのヒットした色を接続し、カラーブレンドノードの出力カラーをマテリアルのディフューズの色へと設定します。この時点では入力カラー2も、またマスクも設定されていませんので、そのまま入力されたヒットした色がマテリアルへと接続されています。
次に、入力カラー2を設定してみます。今回は単純にシンプルに色だけを指定しようと思います。シェーダツリーの場合、単に色を指定するためだけのテクスチャを追加するには、レイヤー追加 > 処理 > Constantを選びますが、ノードでも全く同じように、スケマティックビューの追加 > シェーダノード > 処理 > Constantというテクスチャを追加して使用します。球体が映り込んでいる床面と同じように白を設定したら、テクスチャの色を入力カラー2へと接続します。
カラーブレンドノードを選択し、プロパティからブレンド量を調整してみると、量によって映り込んでいる球体がくっきりしたり、またはぼんやりと消えてなくなったりするなど、映り込む程度を調節できることがわかりますので、このブレンドの量をヒットした距離でコントロールしてみます。ブレンド量はカラーブレンドのノードにデフォルトでは用意されていませんので、カラーブレンドノードを右クリックし、チャンネルの追加からブレンド量を追加しておきます。
また、距離が遠くなると映り込みが薄くなる、つまりブレンド量が低くなり、距離が近くなると映り込みが濃くなる、つまりブレンド量が高くなりますので、距離とブレンド量とは反比例の関係にあります。ここでは単純に除算のノードを使用して、この関係を定義してみます。
追加 > チャンネルモディファイヤ > 演算 > 基本演算:除算ノードを追加します。反比例となりますので、ヒットした距離を入力Bへ、そしてその出力をカラーブレンドのブレンド量へと接続します。除算ノードのプロパティから値Aに適当な値を入力したら、球体を選択し、移動ツールで床との距離を変えてみます。すると、球体が床から離れるにしたがって映り込む球体が薄くなり、床に近づくとくっきりと映り込むようになります。
スケマティックビュー上で追加したテクスチャノード、今回の場合はConstantノードですが、このノードを外した場合の効果を確認したいといった場合には、わざわざConstantノードの接続を外す必要はありません。スケマティックビューで追加されたテクスチャノードに関しては、シェーダツリーのNodesというフォルダの中にリストがまとめられてありますので、このリストの中から該当するテクスチャノードの目のアイコンを外せば、通常のシェーダツリーと同じように効果のオンオフを切り替えることができます。
このように、レイキャストノードからは放射したレイにヒットした色や距離を取得することで、シェーダツリーだけでは行えなかった表現が可能になります。