posted by cimple 2013. 8. 24. 19:42

Vray for Maya Shader Development Tips


1. Shader 의 종류


Maya Document 에서는 Maya Shader 를 아래와 같이 분류하고 있다.


Vray Shader 를 Maya Plug-in 과 함께 사용할 때 해당 classification string 을 함께 써 줌으로써 해당 Maya classification 으로 분류할 수 있다.


Vray Maya SDK Document 를 보면, (http://help.chaosgroup.com/vray/help/maya/sdk22/maya_sdk.htmlShader 파트에서 


For materials, the classification (i.e. the string returned for its outApiClassification attribute) must be "shader/surface/utility/:swatch/VRayMtlSwatchGen" (without the quotes) so that the material swatch is rendered with V-Ray;


라는 부분이 있는데, must be 라는 것은 material 에 해당되는 부분으로 생각된다. 여기에서 앞 부분을 해당 shader 의 성격에 맞게 고쳐줄 수 있다. 예를 들어 2D texture 쉐이더의 경우


"texture/2d:swatch/VRayMtlSwatchGen" 


라고 고쳐줄 수 있다. 그런데 정말로 위의 분류에 넣을 경우, Maya 에서 쉐이더를 생성할때 자동으로 2DTexturePlacement 노드를 생성하고 UV attribute 를 연결시킨다. 만약 texture 쉐이더이기는 한데 이러한 과정을 거치지 않는 특이한 쉐이더의 경우,


"texture/:swatch/VRayMtlSwatchGen" 


이런 식으로 분류하면, material 이 아닌 texture 쉐이더라 바로 object 에 assign 할 수 없고, Maya Hypershade 에서는 생성 버튼이 나타나지 않으며, 자동으로 쉐이더를 연결하는 기능은 호출하지 않는 쉐이더로 분류할 수 있다.


이것을 설정해주는 것이 의외로 중요한 게, 이번에 개발했던 Photo projecton V-ray 쉐이더의 경우 Material 이 아니라 Texture 쉐이더였다. 그런데 여기에 연결되는 Maya Shader 타입도 Texture 로 맞춰 주어야 렌더링이 잘 되는 것으로 확인하였다. (100% 확실하지는 않음. 실험적으로 얻어진 결과)


 

 

2. Ghost Coding

 

팁은 아니고, 신기한 현상을 마주해서 글을 남긴다.

 

Vray의 Matrix 와 Vector 를 사용했는데, Vray 의 Matrix 는 3x3 매트릭스이고, Matrix 의 instance 가 각 coloumn 에 [] 연산자로 접근이 가능하도록 했다. (즉, mat[0] 하면 mat 이라는 matrix 의 0번째 column)

 

그런데 그럼 당연하게도 mat[] 의 index 의 크기는 3 (0~2) 여야 하고, Document 에도 그렇게 나와 있는데, 신기하게 mat[3], mat[4], ... , mat[50], 등 array 크기를 넘어선 값에도 계속해서 메모리 에러 없이 값을 출력해 내었다. sizeof 로 mat 의 크기를 측정해 보아도 3이었다. 신기한 일이 아닐수없다.

 

참 이상한 일이었지만, Vray 가 메모리를 따닥따닥 붙여서 활용하기에 mat[3] 이상이 참조하는 주소값이 어떤 값을 가지고 있는 것이라고 결론내었다.

 

 

또 하나 신기한 것은, Vray plugin 에 만들어둔 Transform attribute 에서 offset 에 해당하는 부분이, 아무런 값을 connect 하지 않았음에도 불구하고, 렌더 카메라를 움직이면 자동으로 값이 바뀌는 것을 확인할 수 있었다.

 

단지 하나의 Datatype 일 뿐인데 렌더 카메라에 반응하는게 무척 신기한 일이지만, 어쨌든 카메라가 움직이면서 Camera space 가 바뀜에 따라 Vray shader 에 들어있는 모든 Transform 들의 offset 값이 Camera space 에 맞게 바뀌는 것이라고 결론내었다.

 

그 증거 중의 하나는, 해당 Transform 의 offset 값에 렌더 카메라의 offset 값을 assign 해 주었는데, 값이 항상 0이 찍히는거다. 처음에는 오류인줄 알았는데, 나중에 알고보니 이것이 (카메라를 기준으로 원점을 바라본 좌표 - 원점을 기준으로 카메라를 바라본 좌표) 라는 결과라는 사실에 도달했다.

 

해당 Camera transform offset 을 Worldspace 에서 받아와 0 으로 assign 한 다음, 내가 원하는 offset 값을 더하는 식으로 코딩하고 싶지만, 일단 지금은 WorldMatrx 에서 받은 offset 값을 2번 더하는 식으로 코딩을 해야 할 것 같다.



3. addParamTransform 하는 방법


Vray plug-in 에서 int, float 같은 데이터타입의 경우 


    addParamInt("photonSubdivs", 500);

하는 식으로 초기값을 주어 추가할 수 있는데, Transform 같은 데이터타입의 경우 어떻게 이렇게 한 줄에 초기화해야할지 난감하다.


다행히 다음과 같은 연산자를 통해서 초기화할 수 있다.


    addParamTransform("transform", WORLD_TRANSFORM, Transform(1));


이런 식으로 초기화하면 된다.



4. 플러그인에서 값 받아와서 Set 해주기


아직 구조를 제대로 파악하기가 좀 어렵지만, 지금까지 알아낸 방법으로는


frameBegin(VR::VRayRenderer *vray)


에서 플러그인 값을 받아와, 구조체의 파라미터 변수에 Set 해줄 수 있다. 


굳이 여기에서 값을 받아오지 않아도 input 값이 연결되는데, 


paramList->setParamCache("color", &color);

이렇게 Cache 로 만드는 부분과 관련이 있는 것 같다. 확실하지는 않다;; 그러나 이 경우 위에서 살펴보았던 Ghost Transform 상황이 발생한다. scene offset 을 transform 에 자기 맘대로 뺴버리는 상황이 발생한 것이다. 여기서 명시적으로 input parameter 값을 구조체 변수에 set 해주면 정상적으로 값이 찍힌다.




5. Vray 에서 Camera Projection 이 이상하게 렌더되는 이유


Vray 에서 Camera Projection 이 Software 와 Mental-ray 와는 다르게 렌더되는 현상이 발생하였다.

무척이나 황당한 일이었는데, MPTK 를 제작한 GLYPH 에서 FAQ 에 해당 문제에 대한 이유를 제공하였다. 이유는 Vray 에서 Camera projection 을 계산하는 방법이 Software 와는 다르게 계산하기 때문이다.


해결하는 방법은 Projection Node 에서 Camera Projection Attributes 의 Fit Type 을 바꾸어 주면 된다. Maya Software / Mental Ray 에서는 Match Camera Film Gate 를, Vray 에서는 None 이나 Match Camera Resolution 을 선택해 주면 된다.