前回の Sampler Info の Ray Direction を利用したシェーダーの作成を 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;
}
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;
-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;