마야 씬에서 마야 쉐이더를 아놀드 쉐이더로 바꾸고 아놀드렌더러로 렌더링을 하면 같은 퀄리티 기준으로 렌더타임은 4배이상까지 빠르기도 한다.
그래서 귀찮지만 마야 쉐이더를 모두 아놀드 쉐이더로 바꾸기로 결정.
그런데 한두개도 아니고 30개 정도 되면 짜증이 난다.
그리하여 자동(?)으로 마야 쉐이더를 아놀드쉐이터로 바꿔주는 간단한 MEL을 하나 짜보았다. 매우 간단하고 원리도 단순하다. 선택한 마야 쉐이더에서 텍스쳐를 찾아서 아놀드 쉐이더를 하나 만들어서 color는 color에 연결을 해주고 만약 알파채널이 있으면 그것도 연결해주고 혹시 텍스쳐에 bump설정이 되어 있으면 그것도 연결을 해준다.
즉, color, alpha, bump 요렇게만 일단 연결하는걸로 만들었다.
복잡한 쉐이더나 스펙큘러 설정 값이 있다면 그것도 모두 넘겨줘야겠지만 그건 나중에 내가 필요하거나 누군가 요청이 있으면 만들것이고 지금은 단순 텍스쳐만 바꿔주면 되기에 간단하게 짜보았다.
MEL를 짜면서 구글링 했던 참고 정보는 아놀드 렌더 쉐이더 같은 경우 마야 쉐이더와 구조가 좀 달라서 color는 color에 연결을 하면 되는데 투명값은 아놀드의 refaction에서 opacity를 조절하고 연결을 해줘야 한다. 좀 헷갈리는 부분이었다.
string $mShaderSelection[]=`ls -sl`;
int $numShader = size($mShaderSelection);
string $mShader;
for ($mShader in $mShaderSelection){
string $originTexColor[] = `listConnections -source true -type file ($mShader + ".color")`;
string $originTexAlpha[] = `listConnections -source true -type file ($mShader + ".transparency")`;
string $originTexBump[] = `listConnections -source true -type "bump2d" ($mShader)`;
string $NewShader = stringArrayToString({"aiS_",$mShader}, "");
shadingNode -name $NewShader -asShader aiStandard;
connectAttr -force ($originTexColor[0] + ".outColor") ($NewShader + ".color");
if (`attributeExists "outAlpha" $originTexAlpha[0]`){
connectAttr -force ($originTexAlpha[0] + ".outAlpha") ($NewShader + ".opacityR");
connectAttr -force ($originTexAlpha[0] + ".outAlpha") ($NewShader + ".opacityG");
connectAttr -force ($originTexAlpha[0] + ".outAlpha") ($NewShader + ".opacityB");
};
if (`attributeExists "outNormal" $originTexBump[0]`){
connectAttr -force ($originTexBump[0] + ".outNormal") ($NewShader + ".normalCamera");
};
hyperShade -objects $mShader;
hyperShade -assign $NewShader;
}
0 comments:
댓글 쓰기