2012년 6월 28일 목요일

maya render pass 에서 contribution map을 이용한 커스템 쉐이더 적용

maya 에서 랜더링 작업을 하다 보면 합성을 위해 여러 패스를 사용하게 됩니다.
사실 기존 마야의 랜더패스 시스템에서 지원하는 패스들이 워낙 다양하고 그중의 필요한 일부만 쓰이게 되지만 간혹 pPoint 쉐이더나 rim 쉐이더(samlper info를 이용한 쉐이더), rsmb 등의 커스텀 쉐이더를 사용 할 경우 문제가 발생할 수 있습니다.

여기서 문제라 함은 랜더레이어를 나누고 그 랜더레이어에 만든 커스텀 쉐이더를 오버라이드 하는 방식에서 생기는데요. 디테일한 오브젝트에 범프 혹은 디스플레이스먼트 맵이 들어 갔을경우에는 이러한 맵에 따른 오브젝트의 변화를 위에 말한 방식으로 적용하기엔 불편함이 있습니다.

간단히 그림으로 보겠습니다.
작업 환경은 windows7 64bit 에 maya 2011 64bit 이고 랜더러는 mentalray을 이용하였습니다.

첫번째 lambert 쉐이더에 checker를 디스플레이스먼트로 넣고 fractal을 범프(0.1)로 넣었습니다.
두번째는 surface 쉐이더에 ramp 쉐이더에 sampler info를 연결하여만든 쉐이더 입니다.(즉, 디스플레이스먼트와 범프가 빠진 것입니다.)

보시면 합성을 위한 패스를 만들었다고 하기엔 오브젝트 자체가 달라져 버립니다.

사실 이렇게 오브젝트도 하나 밖에 없고 디스맵과 범프맵 하나씩이라면 두번째 만든 surface 쉐이더를 lambert로 바꾸고 속성 조절을 통해 맞출수는 있지만 컨트리뷰션맵을 이용하여 커스텀 쉐이더를 적용하는것을 알아보기 위한 것이니 pass 에서 컨트리뷰션맵을 적용하는 것으로만 얘기 하도록 하겠습니다.

우선 render setting window 에서 passes 에서 Custom Color 을 추가 해줍니다.
 만들어진 customColor pass 를 적용해주고 Contribution map 을 생성하여 만들어둔 customColor을 적용합니다.
하이퍼 쉐이더 윈도우에서 writeToColorBuffer 노드를 하나 만들고
 노드에서 Custom Color Pass 를 만들어둔 customColor 로 지정해줍니다.

 이후에 적용할 오브젝트를 랜더레이어탭에서새롭게 만들어진 contribution map 에 랜더레이어에 오브젝트를 add 하듯이 add 해 줍니다.
 다시 하이퍼 쉐이드 윈도우로 돌아와 writeToColorBuffer노드에 위 그림과 같이 연결을 해주면 모든 설정은 끝난게 됩니다.
masterLayer를 랜더 해보면 랜더뷰 윈도우에서 다음과 같이 랜더패스를 로드해서 볼수 있습니다.

새롭게 생성되는 윈도우의layer 탭에서 customColor 패스에 해당하는 패스를 볼수 있게 되는데요. 랜더 레이어로 만들어서 쉐이더를 적용한것과의 차이가 보이시나요.

기본적인 구조는 랜더 레이어에 포함되어진 오브젝트를 기반으로 내부에 랜더레이어를 하나더 만든다고 보시면 됩니다. 그 랜더레이어가 랜더 패스로 만들어지는것이구요.

씬내에 오브젝트도 많고 쉐이더도 많이 존재 한다면 각 쉐이더 별로 writeToColorBuffer가 존재 해야 합니다.
writeToColorBuffer의 color에는 적용될 쉐이더만 넣어주면 되구요.

writeToColorBuffer외에도 writeToDepthBuffer,writeToLabelBuffer,writeToVectorBuffer가 있으며 용도에 따라 맞춰서 사용하면 됩니다.

참고) writeToColorBuffer 노드에 이처럼 연결 하여 사용되어 지는 쉐이더가 마야 기본 쉐이더 일 경우 연결이 outColor 에서 evaluationPassThrough 로 연결 됩니다.

그런데 이는 범프 값을 표현을 하질 못하더군요.(찾아보면 분명 방법은 있을것이라 생각됩니다.) 개인적인 생각으로는 범프노드에서 나가는 outNormal 을 outColor에서 포함하지 않기 때문이라고 생각합니다.

같은 방법으로 사용하되 mia_material_x_passes 쉐이더를 이용하여 연결을 할 경우

위와 같이 result 에서 evaluationPassThrough 로 연결을 하여 랜더를 할경우 다음 그림과 같이 범프까지 제대로 출력되는것을 알수 있습니다.
결론은 mentalray 에서는 mentalray shader를 이용하자~~ 입니다......... 응..........??!!

2012년 6월 26일 화요일

mel script에서 배열 내용을 무작위로 섞어 보기

python("import maya.cmds as cmds");
python("import random");
//선택된 아이템을 배열에 넣기
python("testArray = cmds.ls( selection=True )");
//파이썬 배열을 mel 배열에 넣기
string $melArray[] = python("testArray");
//배열 출력
print "-----Original Array-----\n";
print $melArray;
print "\n";
//파이썬을 이용해서 배열 셔플
python("random.shuffle (testArray)");
//파이썬 배열을 mel 배열에 넣기
$melArray = python("testArray");
//셔플된 배열 출력
print "-----Shuffle Array------\n";
print $melArray;


















위 이미지는 파이썬을 이용하여 mel script에서 작성된 스크립트 구문을 실행한것입니다.
선택한 오브젝트를 배열에 넣고 배열을 섞는 동작을 합니다.


참고 ) 기본적으로 mel script에는 배열을 섞는 함수가 없습니다.

다음과 같이 사용자 정의 함수를 만들어 섞어 쓸수도 있으며
global proc string[] shuffleArray(string $array[])
{
    for ($i=0;$i<size($array);$i++)
    {
        int $index = rand(size($array));
        string $tmp = $array[$i];
        $array[$i] = $array[$index];
        $array[$index] = $tmp;
    }
    return $array;
}

제일 위에 적힌것처럼 파이썬의 random.shuffle 을 사용하여 배열을 섞을수도 있습니다.

사용하기 편한 방법으로 배열을 랜덤하게 섞어 쓸 수 있습니다.