MEL によるシェーダー 2

線シェーダー

UV 座標を使って縞模様を描くシェーダーを作ってみましょう。

シェーダーの例 2

  1. 以下の MEL スクリプトを makeShader5.mel という名前で作ります。
    global proc makeShader5()
    {
    	string $shname = `shadingNode -asShader surfaceShader`;
    	string $setname = `sets -renderable true -noSurfaceShader true -empty`;
    	connectAttr ($shname + ".outColor") ($setname + ".surfaceShader");
    	string $sampler = `shadingNode -asUtility samplerInfo`;
    	expression -o $shname
    		-s ("float $val = " + $sampler + ".u % 0.05 * 20.0;"
    		+ "if($val >= 0.0 && $val < 0.1)"
    		+ "{"
    		+ "	ocr = 0.0;"
    		+ "	ocg = 0.0;"
    		+ "	ocb = 0.0;"
    		+ "}"
    		+ "else"
    		+ "{"
    		+ "	ocr = 1.0;"
    		+ "	ocg = 1.0;"
    		+ "	ocb = 1.0;"
    		+ "}");
    	sphere;
    	sets -e -fe $setname;
    }
    
  2. Script EditorFile → Source Script によって makeShader5.mel を読み込みます。
  3. Script Editor のインプットウインドウで、makeShader5() を実行します。
    [makeShader5() 実行図]
    (レンダリング実行図)
    [makeShader5() レンダリング図]
    (拡大図)
    [makeShader5() レンダリング図(拡大図)]

スクリプトの解説

global proc makeShader5()
makeShader5 というプロシージャの宣言です。
string $shname = `shadingNode -asShader surfaceShader`;
新しいノードをシェーダーとして作ります。
shadingNode コマンドによってノードを作ることによって、 HyperGraph などでシェーダーとして表示できるようになります。
[作られたシェーダー]
string $setname = `sets -renderable true -noSurfaceShader true -empty`;
シェーダーをコネクトするためのセットを作ります。
-renderable true
作られたセットはシェーディンググループになって、 renderPartition ノードにコネクトされます。
-noSurfaceShader true
デフォールトのシェーダーにコネクトしません。
上で作ったシェーダー $shname にコネクトするからです。
-empty
空のセットを作ります。
セレクトされているオブジェクトがあっても、 このセットに加えません。
[作られたセット]
connectAttr ($shname + ".outColor") ($setname + ".surfaceShader");
シェーダーが出力する色情報を表す outColor アトリビュートを、 セットの surfaceShader アトリビュートにコネクトします。
これで、シェーダー $shname がレンダリング可能になります。
[シェーダーとセットの関係]
string $sampler = `shadingNode -asUtility samplerInfo`;
ユーティリティーノードとして samplerInfo ノードを作ります。
-asUtility
作られるノードをユーティリティーとして作ります。
これによって HyperShade などでユーティリティーとして扱われるようになります。
expression -o $shname
  -s ("float $val = " + $sampler + ".u % 0.05 * 20.0;"
  + "if($val >= 0.0 && $val < 0.1)"
  + "{"
  + "  ocr = 0.0;"
  + "  ocg = 0.0;"
  + "  ocb = 0.0;"
  + "}"
  + "else"
  + "{"
  + "  ocr = 1.0;"
  + "  ocg = 1.0;"
  + "  ocb = 1.0;"
  + "}");
シェーダーに、色を計算するエクスプレッションを定義します。
わかりやすくするために、式の部分だけにして解説してみましょう。
float $val = " + $sampler + ".u % 0.05 * 20.0;
samplerInfo ノードの u アトリビュートの値から、 0.05 の余りを計算して 20.0 倍することによって、 変数 $val に 0.0 から 1.0 の値が代入されます。
この計算で U 方向に 0.05 きざみに 0.0 から 1.0 の値がくり返されます。
[$val の意味]
if($val >= 0.0 && $val < 0.1)
{
  ocr = 0.0;
  ocg = 0.0;
  ocb = 0.0;
}
else
{
  ocr = 1.0;
  ocg = 1.0;
  ocb = 1.0;
}
$val が 0.0 から 0.1 の間の値である場合には黒色に、 それ以外の場合は白にします。
sphere;
シェーダーをアサインするために NURBS の球を作ります。
sets -e -fe $setname;
作られた球に上で作ったシェーダーをアサインします。
-e
エディットモード
-fe
すでに球にアサインされていたシェーダーを切り離して、 新しいシェーダーにアサインし直します。
[HyperGraph の図]

練習

練習課題

参考


Prev
Home | Contents
Mail