一、问题描述:
在项目制作中,由于流程问题,导致灯光渲染时,需要导入同类物体多次,于是产生了大量相同材质节点,数量众多,如何能快速合并同类的材质呢。
二、测试寻找方法:
1、maya默认提供了,如下图的工具,如下图:经过测试发现,必须手动选择材质节点,但要求材质必须被赋予到物体,对于空材质节点,就失效了,哈哈。为了解决此问题,还是需要写个工具,南无阿弥陀佛。
2、当然,还有一种方法就是导入模型前,勾选导入选项,如下图所示,可惜,我们当时项目流程是并行的,材质文件已经合并到一起了。
三、插件开发目标:
1、插件工具的原理分析:目的是实现一键自动识别同类材质,并清理无效材质垃圾节点。本工具的原理核心,其实在于maya 的shadingNetworkCompare命令,通过对比材质节点树,来判断材质是否相同。
2、源码如下:
global proc int tjh_compareShaderSG(string $sgA,string $sgB)
{
// create compare task
string $shadingNetworkComparison = ` shadingNetworkCompare $sgA $sgB `;
// Result: shadingNetworkComparison1
int $result = ` shadingNetworkCompare -q -equivalent $shadingNetworkComparison `;
// delete compare task
shadingNetworkCompare -delete $shadingNetworkComparison;
return $result;
}
//shadingNetworkCompare -q -network1 shadingNetworkComparison1;
global proc tjh_compareShaders_proc()
{
string $shaders[]= ` ls -type "shadingEngine" `;
int $i,$j;
for($j =0; $j<size($shaders);$j++)
{
for($i =$j+1; $i<size($shaders); $i++)
{
int $result = 0;
$result = ` tjh_compareShaderSG $shaders[$j] $shaders[$i] `;
//print("\n $j = "+$j +"\n $i = "+$i);
if($result ==1)
{
string $shadingNodei[] = ` listConnections -s 1 -d 0 ($shaders[$i]+".surfaceShader") `;
string $shadingNodej[] = ` listConnections -s 1 -d 0 ($shaders[$j]+".surfaceShader") `;
select -cl;
hyperShade -objects $shadingNodei[0];
hyperShade -assign $shadingNodej[0];
}
}
}
hyperShadePanelMenuCommand("hyperShadePanel1", "deleteUnusedNodes");
}
global proc tjh_combinePolySameShaders()
{
global string $tjh_compareShadersA[];
global string $tjh_compareShadersB[];
if (`windowPref -exists tjh_compareShaders_window`)
windowPref -remove tjh_compareShaders_window;
if (`window -exists tjh_compareShaders_window`)
deleteUI tjh_compareShaders_window;
window -mxb 0 -mnb 0 -title "南无阿弥陀佛" -w 200 -h 50 tjh_compareShaders_window;
columnLayout ;
separator -height 5 -style "in";
text -al "center" -w 200 -h 25 -l "Same-shaders Combine 1.0";
separator -height 5 -style "in";
button -bgc 0.2 0.2 0.5 -w 200 -l "Combine Shaders " -c "tjh_compareShaders_proc";
separator -height 5 -style "in";
showWindow;
}
tjh_combinePolySameShaders;
3、插件用法:拷贝如上代码到txt文本中,一定保存为utf-8编码,高于maya2018新版,对中文兼容支持需要使用utf-8的文本txt文件,如下图选择文本编码模式,之后保存txt:
4、改txt拓展名为.mel文件,之后拖动mel文件到maya主场口,会弹出如下界面:
5、直接点击蓝色按钮即可,材质一下子少了好几倍:
好了,分享结束,南无阿弥陀佛,哈哈。