MEL によるシェーダー 1
シェーダーの作り方
Maya では C++ 言語などでプラグインを作らなくても、
MEL によって独自のシェーダーを作ることができます。
そのためには、シェーディングノードにエクスプレッションを定義して色の値を計算します。
シェーダーの例 1
シンプルな、赤一色のシェーダーを作ってみましょう。
- 以下の MEL スクリプトを makeShader1.mel という名前で作ります。
global proc makeShader1()
{
string $shname = `shadingNode -asShader surfaceShader`;
string $setname = `sets -renderable true -noSurfaceShader true -empty`;
connectAttr ($shname + ".outColor") ($setname + ".surfaceShader");
expression -o $shname -s "ocr = 1; ocg = 0; ocb = 0";
sphere;
sets -e -fe $setname;
}
- の によって makeShader1.mel を読み込みます。
- のインプットウインドウで、makeShader1() を実行します。
スクリプトの解説
global proc makeShader1()
- makeShader1 というプロシージャの宣言です。
string $shname = `shadingNode -asShader surfaceShader`;
- 新しいノードをシェーダーとして作ります。
shadingNode コマンドによってノードを作ることによって、
HyperGraph などでシェーダーとして表示できるようになります。
以下の図では、新しく作られたシェーダーが Hypershade に surfaceShader1 として表示されています。
string $setname = `sets -renderable true -noSurfaceShader true -empty`;
- シェーダーをコネクトするためのセットを作ります。
- -renderable true
- 作られたセットはシェーディンググループになって、
renderPartition ノードにコネクトされます。
- -noSurfaceShader true
- デフォールトのシェーダーにコネクトしません。
上で作ったシェーダー $shname にコネクトするからです。
- -empty
- 空のセットを作ります。
セレクトされているオブジェクトがあっても、
このセットに加えません。
connectAttr ($shname + ".outColor") ($setname + ".surfaceShader");
- シェーダーが出力する色情報を表す outColor アトリビュートを、
セットの surfaceShader アトリビュートにコネクトします。
これで、シェーダー $shname がレンダリング可能になります。
expression -o $shname -s "ocr = 1; ocg = 0; ocb = 0";
- シェーダーにエクスプレッションを定義して、
出力する色を計算します。
ocr が赤、ocg が緑、ocb が青を表すアトリビュートです。
色の値の範囲は、各色 0.0 〜 1.0 です。
つまり、結果が 0.0 から 1.0 の範囲になる計算式なら、
どんなものでも色の計算に使用できます。
sphere;
- NURBS の球を作ります。
sets -e -fe $setname;
- 作られた球に上で作ったシェーダーをアサインします。
- -e
- エディットモード
- -fe
- すでに球にアサインされていたシェーダーを切り離して、
新しいシェーダーにアサインし直します。
練習
- 使用例の makeShader1.mel を参考にして、makeShader2.mel を作り、
セレクトされたオブジェクトにシェーダーがアサインされるようにしてみましょう。
(実行例)
- NURBS・ポリゴンなどで適当にオブジェクトを作り、セレクトしておきます。
- の によって makeShader2.mel を読み込みます。
- のインプットウインドウで、makeShader2() を実行します。
セレクトされた各オブジェクトにシェーダーがアサインされます。
- 使用例の makeShader2.mel を参考にして、makeShader3.mel を作り、
samplerInfo ノードの facingRatio (fr) アトリビュートの値をエクスプレッションで使用することによって、
陰影がつくようにしてみましょう。
facingRatio アトリビュートは、
カメラとサンプルポイントの法線との角度が 0 度なら 1.0、
90 度なら 0.0 になります。
なお、サンプルポイントとは、カメラから出る視線がオブジェクトと交わった点のことです。
(実行例)
- NURBS・ポリゴンなどで適当にオブジェクトを作り、セレクトしておきます。
- の によって makeShader3.mel を読み込みます。
- のインプットウインドウで、makeShader3() を実行します。
セレクトされた各オブジェクトにシェーダーがアサインされます。
(ヒント)
- samplerInfo ノードを作るコマンドは以下のとおりです。
shadingNode -asUtility samplerInfo;
このコマンドによって samplerInfo ノードの名前が文字列として返ってくるので、
文字列の変数に代入しておきます。
- エクスプレッションの式においては、
ノードのアトリビュートの値は
getAttr コマンドを使用しないでも得ることができることに注意してください。
例えば、エクスプレッションの式で以下のようにアトリビュート facingRatio の値を変数に代入します。
float $val = samplerInfoノードの名前.facingRatio;
- エクスプレッションにおける色を計算する式は、
以下のようにしておいてください。
$val に samplerInfo ノードの facingRatio アトリビュートの値が入っているとします。
ocr = $val;
ocg = $val;
ocb = $val;
練習課題
参考
- Maya
Maya, MEL, Maya関係のコマンドなどのページ。
Prev | Next
Home | Contents
Mail