项目接下来要开始大量使用Shave&3DL,而现有的破解版本9.0.0在配置渲染时是异常繁琐的,正好之前写过一个小工具可以自动化执行这些重复的操作,但是有些小bug,今天拿出来修改了一下已经可以使用。上图就是使用此工具设置的Shave的预设grass渲染的结果,原本繁琐的步骤可以在半分钟内搞定了。
使用方法秉承极简主义,界面语言响应Maya中文化的大潮流。
三步走:在打算使用3Delight渲染shave的场景里面执行此mel,会弹出如图的弱智界面;
- 点1初始化
(建立render pass,自动选择渲染相机) - 选择照明灯光,点2
(为灯光建立set和相应delightAttr节点,调整deep阴影选项以及灯光自身bias值) - 框选所有投影、遮挡物体,包括shave,点3
(为物体建立delightAttr节点,接受指定灯光光照,并设置物体Matte属性为true以遮挡shave)
可选步骤:点阴影分辨率来设置阴影贴图的分辨率,以适应不同尺度的场景。
正如前面所说,使用方法是极其简单的,但是很方便实用,适合厌倦重复或者不熟悉设置的孩子,三步就可以渲染出Renderman规格的纯毛发。
完善后暂时没发现其他问题,如果有问题欢迎反馈。
*注意* 此MEL只针对9.0.0版本的3Delight。
Source:
/* suDLS.mel cuckons[at]163.com
* Make shave renderable by 3DLFM automatically.
2011.7.8
*/
int $suDLS_res = 512;
print $suDLS_res;
//Get the renderable camera
proc string suGetRenderCam(){
string $renderCam;
string $cams[] = `ls -type camera`;
for ($each in $cams){
if (`getAttr ($each+".renderable")`){
$renderCam = $each;
break;
}
}
return $each;
}
proc suSetShave(){
DL_createSurfaceShader("C:/Program Files/3Delight/shaders/Shave.sdl", 0);
string $shave[] =`ls -typ shaveHair`;
DL_setObjectAttrib("Shave1","surface",$shave);
setAttr "Shave1.SHAVEselfshad" 0.6;
print "Shave OK.\n";
}
//Setup the lightSet
global proc suDLS_SetLight(){
global int $suDLS_res;
string $lights[] = `ls -sl`;
sets -n "lightSet";
DLA_create();
//Assign
DL_setObjectAttrib("delightLightAttribs1","delightLightAttribs",$lights);
setAttr "delightLightAttribs1.generateShadowMaps" 1;
setAttr "delightLightAttribs1.shadowMapResolutionX" $suDLS_res;
setAttr "delightLightAttribs1.shadowMapResolutionY" $suDLS_res;
setAttr delightLightAttribs1.shadowMapType 1;
for ($each in $lights) {
string $shape[] = `listRelatives -s $each`;
setAttr ($shape[0]+".useDepthMapShadows") 1;
setAttr ($shape[0]+".dmapBias") 0.2;
}
print "Light OK.\n";
}
global proc suDLS_SetObj(){
string $objs[] = `ls -sl -l`;
//Check over the objs and group if shavenode have no parent
for ($i = 0; $i<size($objs);$i++){
string $foo[] = `listRelatives -s -f $objs[$i]`;
if (size($foo) == 0)
continue;
if (nodeType($foo[0])=="shaveHair"){
string $grp =`group -n "shave_grp" $objs[$i]`;
$objs[$i] = $grp;
}
}
//<-------------
//create the Matte objects
//
sets -n "objSet" $objs;
DGA_create();
//Assign
DL_setObjectAttrib("delightGeoAttribs1","delightGeoAttribs",$objs);
//Illumination from
addAttr -ln "illuminationFrom" -at message delightGeoAttribs1;
//Matte Object
DGA_matteObjectCreateAttr delightGeoAttribs1;
setAttr "delightGeoAttribs1.matteObject" 1;
//lightSet
DL_disconnectNode( "delightGeoAttribs1.illuminationFrom" );
DL_connectNodeToMessagePlug( "lightSet", "delightGeoAttribs1.illuminationFrom" );
DL_disconnectNode( "delightLightAttribs1.shadowObjects" );
DL_connectNodeToMessagePlug( "objSet", "delightLightAttribs1.shadowObjects" );
//----------------->
//<----------------
//create the anti Matte objects
//
string $shaveShape[] =`ls -typ shaveHair`;
for ($i=0;$i<size($shaveShape);$i++) {
string $foo[] = `listRelatives -p $shaveShape[$i]`;
$shaveShape[$i] = $foo[0];
}
DGA_create();
//Assign
setAttr "delightGeoAttribs2.inheritDAGParentAttributes" 0;
DL_setObjectAttrib("delightGeoAttribs2","delightGeoAttribs",$shaveShape);
//Illumination from
addAttr -ln "illuminationFrom" -at message delightGeoAttribs2;
//Matte Object
DGA_matteObjectCreateAttr delightGeoAttribs2;
setAttr "delightGeoAttribs2.matteObject" 0;
//lightSet
DL_disconnectNode( "delightGeoAttribs2.illuminationFrom" );
DL_connectNodeToMessagePlug( "lightSet", "delightGeoAttribs2.illuminationFrom" );
suSetShave();
print "Objects OK.\n";
}
//Start setup
//
global proc suDLS_Init() {
source DL_aeCommon.mel;
source DL_attribsNodeManager.mel;
source DL_globals.mel;
source DL_lightAttribsNode;
source DL_geoAttribsNode.mel;
int $sample = 3;
string $rpn = `DL_createRenderPassNode`;
//Sample
setAttr ($rpn+".pixelSamplesX") $sample;
setAttr ($rpn+".pixelSamplesY") $sample;
//Set the renderable camera
AE_setConnectedNodeFromMenu delightRenderPass1.camera AE_updateAE `suGetRenderCam`;
print "Initialized OK.\n";
}
global proc suDLS_SetRes() {
global int $suDLS_res;
string $text;
string $result = `promptDialog
-title "分辨率"
-message "设置阴影贴图的分辨率,\n越高越清晰,但渲染时间越长.\n建议512 - 1024\n\n*注意* 此选项只影响以后设置的灯光,\n已经设置好的灯光不受影响!\n"
-button "OK" -button "Cancel"
-defaultButton "OK" -cancelButton "Cancel"
-dismissString "Cancel"`;
if ($result == "OK") {
$text = `promptDialog -query -text`;
$suDLS_res = int($text);
}
}
// Delight Setup UI
global proc suDLS() {
global int $suDLS_res = 512;
string $win_name = "suDLS_UI";
if (`window -q -exists $win_name`)
deleteUI $win_name;
window -t "3Delight&Shave Setup" -wh 200 126 $win_name;
columnLayout -adj 1;
button -l "1. 初始化" -c "suDLS_Init";
button -l "2. 设置灯光" -c "suDLS_SetLight";
button -l "3. 设置物体" -c "suDLS_SetObj";
button -l "阴影分辨率.." -c "suDLS_SetRes";
showWindow();
}