mentalray depth 멘탈레이 텍스쳐를 이용한 뎁스 쉐이더 만들기
이러한 자연 환경을 만든다고 했을때, 3D 나무이든, 판맵을 쓰든 어쨌든 나무 맵 텍스쳐를 이용하게 된다.
이러한 씬을 구성 했을때 뎁스를 뽑고자 하면... 아.. 머리에 쥐가 난다.
기본적으로 뎁스는 오브젝트를 근간으로 하기 때문에 판맵을 쓰는 뎁스는 죄다 폴리곤 모양그대로 사각형으로 나오기 때문이다.
그래서 나무 같은것에서 뎁스를 뽑기 위해선 뎁스에 transparency도 연결을 해주어야 하는데 오브젝트가 한두개고 나무 텍스쳐 쉐이더 한두개라면 뭐 일일이 손으로 만져서 바꿔주면 되지만 수백개의 나무라면? ㅠㅠ 멘붕.
그래서 컬러 쉐이더를 자동으로 투명값 그대로 뎁스 쉐이더로 바꿔주는 멜을 짜보았다.
사실 예전에도 만들어 놓긴 했는데... 그 당시 작업하던 씬에 맞춰 작업을 하느라 다른 씬에 적용하면 에러가 상당하고 실행이 안되는 경우까지 있었다. 그래서 요번엔 깔끔하게 그냥 다시 만들었다. 위의 컬러 맵들이 아래처럼 뎁스로 나온다.
사용방법은 이제 기본적인 MEL 사용법은 패쓰하고.
전에 만든 MEL은 오브젝트 단위였는데 요것은 쉐이더 단위이다.
즉, 컬러 쉐이더를 뎁스 쉐이더도 만들어 준다. 물론 원본 컬러 쉐이더는 그대로 유지를 한다.
1. 뎁스 렌더 레이어를 만든다. 뎁스를 걸 오브젝트를 포함시켜 주고. (라이트는 없어야 한다)
2. 렌더러는 멘탈레이로 하고.
3. 뎁스로 바꿀 쉐이더를 선택한다. 여러개 한꺼번에 좌악~
4. 시스템 부하를 줄이기 위해서 마야 뷰창의 렌더 모드는 4번 와이어 프레임으로 해 놓는다. 5번도 괜찮다.
다만 6번 쉐이딩 모드로 해 놓으면 구린 시스템에서는 다운 될 수도 있다.
5. 아래 MEL script를 적용한다.
제가 만든 MEL은 기본적으로 멘탈레이의 뎁스를 이용했습니다.
혹시라도 각자 씬이나 환경에 맞게 변형 할 수 있도록 주석으로 보기 쉽게 구분 해놓았습니다.
변수 타입 설정하는거랑 노드 알아내는거가 역시나... 구글링 좀 해서 찾아 냈는데
여전히 귀찮고... 점점 늙어가는 머리라 시간이 많이 걸리네요.
도움이 되셨으면 이만큼 제가 노력하는 만큼 제일 밑에 광고라도 클릭해주시거나
댓글이라도 좀 남겨주세요. ㅎㅎㅎ
MEL 소스
/*****************************************************************************************************************
DEPTH 쉐이더 생성 함수
******************************************************************************************************************/
global proc Make_TEXTURE_DEPTH()
{
string $Shader_List[];
$Shader_List=`ls -sl`;
int $Shader_count;
int $size_obj_count=size($Shader_List);
string $Shader_Name;
string $texture_Name[];
/*****************************************************************************************************************
멘탈레이 depth 쉐이더 (surfaceShader) 생성
******************************************************************************************************************/
createNode samplerInfo;
addAttr -sn "cameraNearClipPlane" -ln "cameraNearClipPlane" -at "float";
addAttr -sn "cameraFarClipPlane" -ln "cameraFarClipPlane" -at "float";
setAttr ".cameraNearClipPlane" 0.10;
setAttr ".cameraFarClipPlane" 10000;
string $_samplerInfo_name[]=`ls -sl`;
createNode multiplyDivide;
setAttr ".i2" -type "float3" -1 1 1 ;
string $_multiplyDivide_name[]=`ls -sl`;
createNode setRange;
setAttr ".n" -type "float3" 1 0 0 ;
string $_setRange_name[]=`ls -sl`;
createNode surfaceShader;
string $_surfaceShader_name[]=`ls -sl`;
createNode shadingEngine;
setAttr ".ihi" 0;
setAttr ".ro" yes;
string $_shadingEngine_name[]=`ls -sl`;
createNode materialInfo;
string $_materialInfo_name[]=`ls -sl`;
/*-connectAttr "samplerInfo1.pz" "multiplyDivide1.i1x";-*/
string $_tempForConvertA = stringArrayToString({$_samplerInfo_name[0],".pz" }, "");
string $_tempForConvertB = stringArrayToString({$_multiplyDivide_name[0],".i1x" }, "");
connectAttr $_tempForConvertA $_tempForConvertB;
/*-connectAttr "multiplyDivide1.ox" "setRange1.vx";-*/
string $_tempForConvertA = stringArrayToString({$_multiplyDivide_name[0],".ox" }, "");
string $_tempForConvertB = stringArrayToString({$_setRange_name[0],".vx" }, "");
connectAttr $_tempForConvertA $_tempForConvertB;
/*-connectAttr "samplerInfo1.cameraNearClipPlane" "setRange1.onx";-*/
string $_tempForConvertA = stringArrayToString({$_samplerInfo_name[0],".cameraNearClipPlane" }, "");
string $_tempForConvertB = stringArrayToString({$_setRange_name[0],".onx" }, "");
connectAttr $_tempForConvertA $_tempForConvertB;
/*-connectAttr "samplerInfo1.cameraFarClipPlane" "setRange1.omx";-*/
string $_tempForConvertA = stringArrayToString({$_samplerInfo_name[0],".cameraFarClipPlane" }, "");
string $_tempForConvertB = stringArrayToString({$_setRange_name[0],".omx" }, "");
connectAttr $_tempForConvertA $_tempForConvertB;
/*-connectAttr "setRange1.ox" "surfaceShader1.ocr";-*/
string $_tempForConvertA = stringArrayToString({$_setRange_name[0],".ox" }, "");
string $_tempForConvertB = stringArrayToString({$_surfaceShader_name[0],".ocr" }, "");
connectAttr $_tempForConvertA $_tempForConvertB;
/*-connectAttr "setRange1.ox" "surfaceShader1.ocg";-*/
string $_tempForConvertA = stringArrayToString({$_setRange_name[0],".ox" }, "");
string $_tempForConvertB = stringArrayToString({$_surfaceShader_name[0],".ocg" }, "");
connectAttr $_tempForConvertA $_tempForConvertB;
/*-connectAttr "setRange1.ox" "surfaceShader1.ocb";-*/
string $_tempForConvertA = stringArrayToString({$_setRange_name[0],".ox" }, "");
string $_tempForConvertB = stringArrayToString({$_surfaceShader_name[0],".ocb" }, "");
connectAttr $_tempForConvertA $_tempForConvertB;
/*-connectAttr "surfaceShader1.oc" "set1.ss";-*/
string $_tempForConvertA = stringArrayToString({$_surfaceShader_name[0],".oc" }, "");
string $_tempForConvertB = stringArrayToString({$_shadingEngine_name[0],".ss" }, "");
connectAttr $_tempForConvertA $_tempForConvertB;
/*****************************************************************************************************************
FOR 반복문 시작
******************************************************************************************************************/
for ($Shader_count=0;$Shader_count<$size_obj_count;$Shader_count++)
{
string $Shader_Name = $Shader_List[$Shader_count];
string $Shader_Trans = stringArrayToString({$Shader_Name,".transparency"}, "");
$texture_Name = `listConnections -source true -type file $Shader_Trans`;
/*****************************************************************************************************************
쉐이더별 DEPTH_SHADER (lambert) 만들기
******************************************************************************************************************/
$DEPTH_Shader = stringArrayToString({"DEPTH_SHADER_",$Shader_Name}, "");
shadingNode -name $DEPTH_Shader -asShader lambert;
/*****************************************************************************************************************
DEPTH_SHADER (lambert) 속성 조절하기
******************************************************************************************************************/
string $DEPTH_Shader_diff = stringArrayToString({$DEPTH_Shader,".diffuse" }, "");
string $DEPTH_Shader_trans = stringArrayToString({$DEPTH_Shader,".translucence" }, "");
string $DEPTH_Shader_transD = stringArrayToString({$DEPTH_Shader,".translucenceDepth" }, "");
string $DEPTH_Shader_transF = stringArrayToString({$DEPTH_Shader,".translucenceFocus" }, "");
string $DEPTH_Shader_shadowA = stringArrayToString({$DEPTH_Shader,".shadowAttenuation" }, "");
setAttr $DEPTH_Shader_diff 1;
setAttr $DEPTH_Shader_trans 1;
setAttr $DEPTH_Shader_transD 5;
setAttr $DEPTH_Shader_transF 0;
setAttr $DEPTH_Shader_shadowA 0;
/*****************************************************************************************************************
멘탈레이 depth 쉐이더 (surfaceShader)와 DEPTH_SHADER (lambert) 연결하기
******************************************************************************************************************/
string $MR_depth_color = stringArrayToString({$_surfaceShader_name[0],".outColor" }, "");
string $DEPTH_Shader_color = stringArrayToString({$DEPTH_Shader,".color" }, "");
string $DEPTH_Shader_ambColor = stringArrayToString({$DEPTH_Shader,".ambientColor" }, "");
connectAttr -f $MR_depth_color $DEPTH_Shader_color;
connectAttr -f $MR_depth_color $DEPTH_Shader_ambColor;
string $texture_outAlpha = stringArrayToString({$texture_Name[0],".outTransparency" }, "");
string $DEPTH_Shader_Trans= stringArrayToString({$DEPTH_Shader,".transparency" }, "");
connectAttr -f $texture_outAlpha $DEPTH_Shader_Trans;
/*****************************************************************************************************************
오브젝트에 DEPTH_SHADER (lambert) 적용하기
******************************************************************************************************************/
hyperShade -objects $Shader_Name;
hyperShade -assign $DEPTH_Shader;
}
}
Make_TEXTURE_DEPTH()