Utility ノード

Utility ノードとは

Utility ノードはシェーダーの機能を拡張することができます。

General Utilities
マッピング、算術演算など
Color Utilities
色に関するもの
Switch Utilities
同じシェーダーで、オブジェクトごとに一部のアトリビュートだけ変化させたい場合に使用

Sampler Info とは

Sampler Info ノードによって、 サンプリング点(カメラからの視点がオブジェクトにあたる点)についての、 さまざまな情報を得ることができます。

Facing Ratio (0.0 〜 1.0)
サンプリング点からカメラへのベクトルと、法線ベクトルの内積を計算したもの。
カメラへの向きと、法線がどれくらいの角度をなしているかがわかります。
1.0 で向きが同じ、0.0 で角度が 90 度になります。

Sampler Info の使用例 1

Sampler Info を作成して、色々な実験をしてみましょう。
ここでは、Sampler Info の他に以下のノードを使ってみます。

Reverse
入力(0.0 〜 1.0)の値を逆転(1.0 〜 0.0)させます。
Remap Value
入力を別の値にマッピングします。
ramp に似ています。
Blender Colors
2 つの色を混ぜ合わせます。
  1. 球と平面で適当にシーンを作成します。
    シーン
    わかりやすくするために、平面にテクスチャーをアサインしておきます。
    レンダリング画像
  2. Blinn マテリアルを作成し、球にアサインしておきます。
  3. Sampler Info ノードを作成します。
    Hypershade → Create Maya Nodes → General Utilities → Sampler Info から Sampler Info ノードを作成します。
    Hypershade
  4. Sampler Info ノードの Facing Ratio と Blinn ノードの transparencyR, transparencyG, transparencyB をコネクトします。
    Connection Editor
    Hypershade
  5. レンダリングするとカメラと同じ向きの部分が透明に、 垂直な部分が不透明になっているのがわかります。
    レンダリング画像
  6. transparency と同じように、 Sampler Info の Facing Ratio を球の incandenscence にコネクトしてみます。
    Connection Editor
    Connection Editor
    球の真ん中が白くなって透明になりません。
    Connection Editor
  7. 修正するために incandenscence へのコネクトをはずします。
    Connection Editor
  8. Reverse ノードを作成します。
    Hypershade → Create Maya Nodes → General Utilities → Reverse
    Hypershade
  9. Sampler Info の Facing Ratio を Reverse ノードの input にコネクトします。
    Connection Editor
  10. Reverse ノードの output を球の incandenscence にコネクトします。
    Connection Editor
    Connection Editor
  11. レンダリングをすると、今度は真ん中が透明になっています。
    レンダリング画像
  12. 次に、色を変更できるようにしてみましょう。
    そのために、Reverse ノードを削除し、Blend Colors ノードを作成します。
    Hypershade
  13. Sampler Info の Facing Ratio を Blender Colors ノードの Blender にコネクトします。
    Connection Editor
  14. Blender Colors ノードの Blender を球の incandenscence にコネクトします。
    Connection Editor
    Hypershade
    レンダリング画像
  15. Blender Colors ノードのアトリビュート Color1, Color2 を変更すると色を変えることができます。
    アトリビュートエディタ
    レンダリング画像
  16. しかし、このままでは incandenscence の範囲を調節することができません。
    ということで、Remap Value ノードを作成します。
    Hypershade → Create Maya Nodes → Colors Utilities → Remap Value
    Hypershade
  17. Sampler Info の Facing Ratio を Remap Value の Input Value にコネクトします。
    Connection Editor
  18. Sampler Info の Facing Ratio から Blend Colors の Blender へのコネクトを解除します。
  19. Remap Value の Out Value を Blend Colors の Blender にコネクトします。
    Connection Editor
    Hypershade
  20. Remap Value の Value セクションで値を調節します。
    Hypershade
    以下の図は、interpolation を smooth にして、グラフを変更しています。
    Hypershade
    Hypershade

Sampler Info のアトリビュート

カメラからの視線と法線の角度を調べるには Facing Ratio が便利ですが、 法線マップによる法線ベクトルとの角度を調べるためには使用できません。 その場合には Ray Direction などを使って自分で内積の計算を行う必要があります。

Ray Direction
カメラからサンプリング点への長さ 1 のベクトル

Sampler Info の使用例 2

Crater テクスチャーを利用して、 バンプの部分にも Facing Ratio を使用したのと同じような効果が出るようにしてみましょう。
新しく以下のノードを利用します。

Multiple Divide
1 〜 3 個の数同士を乗算・除算・階乗します。
Vector Product
ベクトル同士の演算(内積・外積など)を行います。
  1. 球と平面で適当にシーンを作成します。
    シーン
    わかりやすくするために、平面にテクスチャーをアサインしておきます。
  2. Surface Shader マテリアルを作成し、球にアサインしておきます。
    ここでは、色の計算をすべてシェーディングネットワークで計算してしまうので、 Surface Shader を使用します。
    レンダリング画像
  3. General Utilities から Sampler Info ノードを作成します。
  4. General Utilities から Multiple Divide ノードを作成します。
  5. Sampler Info ノードの Ray Direction と Multiple Divide ノードの input1 をコネクトします。
  6. Multiple Divide ノードのアトリビュートエディタを開き、 input2 の 3 つの数値をすべて -1 にします。
    これによって、カメラからサンプリング点に向かっているベクトルの向きを逆転します。
  7. 3D Texture から Crater ノードを作成します。
  8. General Utilities から Vector Product ノードを作成します。
  9. Crater ノードの outNormal と Vector Product の input1 をコネクトします。
  10. Multiple Divide ノードの output と Vector Product の input2 をコネクトします。
    ここまでのシェーディングネットワークで Facing Ratio と同じ計算しています。
  11. Colors Utilities の Blender Colors ノードを作成します。
  12. Vector Product の outputX を Blender Colors ノードの Blender にコネクトします。
  13. Blender Colors ノードの output を Surface Shader の outColor にコネクトします。
  14. 以下のアトリビュートを適当に変更します。
    Crater ノード
    Frequency
    テクスチャーの色を混ぜる度合い
    Norm Depth
    クレーターの深さ
    Crater のアトリビュートエディタ
    Blender Colors ノード
    Color1
    Blender アトリビュートの値が 1 の場合の値
    Color2
    Blender アトリビュートの値が 0 の場合の値
    Blender Colors のアトリビュートエディタ
    Hypershade
    レンダリング結果
  15. Crater の代わりに任意のバンプマップを使用することができます。
    その場合は、Bump2d または Bump3d の outNormal から Vector Product の input1 へコネクトします。
    Hypershade
    レンダリング結果
    レンダリング結果

Sampler Info を使った MEL スクリプトの例

前回の Sampler Info の Ray Direction を利用したシェーダーの作成を MEL スクリプトで自動化してみましょう。

  1. 以下の MEL スクリプトを makeUtilityNode1.mel という名前で作ります。
    proc string makeSurfaceShader(string $obj)
    {
    	string $shname = `shadingNode -asShader surfaceShader`;
    	string $sgname = `sets -renderable true -noSurfaceShader true -empty`;
    	connectAttr -f ($shname + ".outColor") ($sgname + ".surfaceShader");
    	select $obj;
    	sets -e -forceElement $sgname;
    	return $shname;
    }
    
    proc string makeCrater()
    {
    	string $crater = `shadingNode -asTexture crater`;
    	string $ptex = `shadingNode -asUtility place3dTexture`;
    	connectAttr ($ptex + ".wim[0]") ($crater + ".pm");
    	return $crater;
    }
    
    global proc makeUtilityNode1()
    {
    	string $sname[] = `sphere`;
    	move 0 1 0;
    	nurbsPlane -ax 0 1 0;
    	scale 25 25 25;
    
    	string $ssname = makeSurfaceShader($sname[0]);
    
    	string $siname = `shadingNode -asUtility samplerInfo`;
    	string $mname = `shadingNode -asUtility multiplyDivide`;
    	connectAttr -f ($siname + ".rayDirection") ($mname + ".input1");
    	setAttr ($mname + ".input2X") -1;
    	setAttr ($mname + ".input2Y") -1;
    	setAttr ($mname + ".input2Z") -1;
    
    	string $crname = makeCrater();
    	string $vname = `shadingNode -asUtility vectorProduct`;
    	connectAttr -f ($crname + ".outNormal") ($vname + ".input1");
    	connectAttr -f ($mname + ".output") ($vname + ".input2");
    
    	string $bname = `shadingNode -asUtility blendColors`;
    	connectAttr -f ($vname + ".outputX") ($bname + ".blender");
    	connectAttr -f ($bname + ".output") ($ssname + ".outColor");
    
    	setAttr ($crname + ".frequency") 0.5;
    	setAttr ($crname + ".normDepth") 8;
    	setAttr ($bname + ".color1") -type double3 0 0 0;
    	setAttr ($bname + ".color2") -type double3 0 1 1;
    }
    
  2. スクリプト エディタファイル → ソース スクリプト によって makeUtilityNode1.mel を読み込みます。
  3. スクリプト エディタ のインプットウインドウで、makeUtilityNode1() を実行します。
    (makeUtilityNode1() 実行後の図)
    [makeUtilityNode1() 実行後の図]
    [HyperShade の図]

スクリプトの解説

proc string makeSurfaceShader(string $obj)
SurfaceShader マテリアルを作成し、 $obj で表されるオブジェクトにアサインするプロシージャです。
このプロシージャは SurfaceShader ノードの名前を返すので string がついています。
global がついていないので、この MEL スクリプト内でしか使用できません。
string $shname = `shadingNode -asShader surfaceShader`;
SurfaceShader ノードを作成し、作成されたノード名を変数 $shname に代入します。
string $sgname = `sets -renderable true -noSurfaceShader true -empty`;
SurfaceShader マテリアルをコネクトするためのセットを作ります。
-renderable true
作られたセットはシェーディンググループになって、 renderPartition ノードにコネクトされます。
-noSurfaceShader true
デフォールトのシェーダーにコネクトしません。
上で作ったマテリアル $shname にコネクトするためです。
-empty
空のセットを作ります。
セレクトされているオブジェクトがあっても、 このセットに加えません。
connectAttr -f ($shname + ".outColor") ($sgname + ".surfaceShader");
マテリアル $shname が出力する色情報を表す outColor アトリビュートを、 セット $sgname の surfaceShader アトリビュートにコネクトします。
これで、マテリアル $shname がレンダリング可能になります。
select $obj;
$obj を選択します。
sets -e -forceElement $sgname;
選択された $obj をシェーディングループであるセット $sgname に追加します。
-e
編集モードにします。
-forceElement
選択されているオブジェクトを強制的にセットに追加します。
選択されているオブジェクト別のセットのメンバーである場合は、 別のセットから削除されます。
return $shname;
プロシージャの終わりに SurfaceShader ノードの名前を返します。
proc string makeCrater()
crater ノードを作成するプロシージャです。
このプロシージャは crater ノードの名前を返すので string がついています。
string $crater = `shadingNode -asTexture crater`;
crater ノードをテクスチャーとして作成します。
string $ptex = `shadingNode -asUtility place3dTexture`;
ramp ノードをテクスチャーとしてオブジェクトに張るための、 place3dTexture ノードを作成します。
connectAttr ($ptex + ".wim[0]") ($crater + ".pm");
place3dTexture ノードの wim (worldInverseMatrix) アトリビュートと、 crater ノードの pm (placementMatrix) アトリビュートをコネクトします。
return $crater;
プロシージャの最後に crater ノードの名前を返します。
global proc makeUtilityNode1()
Sampler Info を使ったシェーダーを作成するプロシージャ makeUtilityNode1 を定義します
string $sname[] = `sphere`;
NURBS の球を作成します。
move 0 1 0;
NURBS の球を (0, 1, 0) に移動します。
nurbsPlane -ax 0 1 0;
NURBS の平面を作成します。
-ax 0 1 0
平面の軸を (0, 1, 0) の方向にします。
scale 25 25 25;
NURBS の平面を XYZ 方向に 25 倍します。
string $ssname = makeSurfaceShader($sname[0]);
プロシージャ makeSurfaceShader を使って SurfaceShader を作成します。
string $siname = `shadingNode -asUtility samplerInfo`;
samplerInfo ノードを作成します。
string $mname = `shadingNode -asUtility multiplyDivide`;
multiplyDivide ノードを作成します。
connectAttr -f ($siname + ".rayDirection") ($mname + ".input1");
samplerInfo ノードの rayDirection アトリビュートを multiplyDivide ノードの input1 アトリビュートにコネクトします。
setAttr ($mname + ".input2X") -1;
multiplyDivide ノードの input2X アトリビュートを -1 に設定します。
setAttr ($mname + ".input2Y") -1;
multiplyDivide ノードの input2Y アトリビュートを -1 に設定します。
setAttr ($mname + ".input2Z") -1;
multiplyDivide ノードの input2Z アトリビュートを -1 に設定します。
string $crname = makeCrater();
プロシージャ makeCrater を使って crater ノードを作成します。
string $vname = `shadingNode -asUtility vectorProduct`;
vectorProduct ノードを作成します。
connectAttr -f ($crname + ".outNormal") ($vname + ".input1");
crater ノードの outNormal アトリビュートを vectorProduct ノードの input1 アトリビュートにコネクトします。
connectAttr -f ($mname + ".output") ($vname + ".input2");
multiplyDivide ノードの output アトリビュートを vectorProduct ノードの input2 アトリビュートにコネクトします。
string $bname = `shadingNode -asUtility blendColors`;
blendColors ノードを作成します。
connectAttr -f ($vname + ".outputX") ($bname + ".blender");
vectorProduct ノードの outputX アトリビュートを blendColors ノードの blender アトリビュートにコネクトします。
connectAttr -f ($bname + ".output") ($ssname + ".outColor");
blendColors ノードの outColor アトリビュートを SurfaceShader ノードの outColor アトリビュートにコネクトします。
setAttr ($crname + ".frequency") 0.5;
crater ノードの frequency アトリビュートを 0.5 に設定します。
setAttr ($crname + ".normDepth") 8;
crater ノードの normDepth アトリビュートを 8 に設定します。
setAttr ($bname + ".color1") -type double3 0 0 0;
blendColors ノードの color1 アトリビュートを 0 0 0 に設定します。
setAttr ($bname + ".color2") -type double3 0 1 1;
blendColors ノードの color2 アトリビュートを 0 1 1 に設定します。

参考


Prev
Index | Home
Mail