posted by cimple 2013. 11. 20. 00:30




연구하다가 실패케이스로 캡쳐 하나 했는데 이유모르게 마음에듬



posted by cimple 2013. 11. 19. 12:47

스마트폰 데이터 사용량이 다 되어서 사용 내역을 보려고 오랜만에 Olleh 홈페이지에 접속해봤다.


그런데 요금을 이리저리 살펴보니 정체모를 'internet 정보이용료' 라는 것이 매겨져 있는 것이다.


딱 봐도 이상하다 싶어 뜯어보니 나도 모르는 사이에 '휴대폰번호 보호서비스' 라는 1000원짜리 부가서비스에 가입되어 있었다.



검색을 좀 해보니 악명높은 서비스인가보다. 서비스를 찾아보니 가입조건이 좀 웃긴데,



2번째 '기타 외부채널' 이 웃기는 노릇이다. 인터넷에서 자주 하게 되는 소액결재시, 핸드폰 명의자인증 창에서 '가입안내 SMS 수신동의' 를 하면 자동으로 가입된다고 한다. 허허... 이게 무슨 소리요. 아마 나도 모르게 체크박스 하나 지나쳤다고 가입된 모양이다.



더 웃긴건 해지하려면 인터넷으로는 안되고 고객센터에 직접 전화를 해서 해지해야 하는 수고를 거쳐야 한다는 것이다. 물론 전화하니까 금방 해지해 주긴 했지만, 함정을 파 두고 가입시켜놓고, 해지는 또 전화통화를 거치도록 복잡다단하게 해 놓았다니...



1000원이라는 소액이니까 그냥 뭐 해두면 괜찮겠지, 하고 넘어가는 사람들도 상당수일거고, KT 이동통신 가입자가 1500만명을 넘을텐데, 이 중에서 100만명만 나같이 낚여도, 한달에 10억이다. 


정말 웃긴다고 할 수 밖에...



posted by cimple 2013. 11. 7. 19:53



Maya 에서 리깅을 할 때 Null node 를 이용해서 controller 의 parameter 를 zero-out 시켜주는 스크립트이다.


원하는 컨트롤러를 모두 선택하고 스크립트를 실행시키면 된다. 



def zeroOut():
    ctrlList = mc.ls(sl=True) #select all controllers to make zero-out
    for ctrl in ctrlList :
        zeroOutCtrl(ctrl)    

def zeroOutCtrl(ctrlName) :
    nullNodeName = mc.group(empty=True)
    mc.parent(nullNodeName, ctrlName)
    mc.setAttr(nullNodeName+'.translateX', 0.0)
    mc.setAttr(nullNodeName+'.translateY', 0.0)
    mc.setAttr(nullNodeName+'.translateZ', 0.0)
    mc.setAttr(nullNodeName+'.rotateX', 0.0)
    mc.setAttr(nullNodeName+'.rotateY', 0.0)
    mc.setAttr(nullNodeName+'.rotateZ', 0.0)
    mc.setAttr(nullNodeName+'.scaleX', 1.0)
    mc.setAttr(nullNodeName+'.scaleY', 1.0)
    mc.setAttr(nullNodeName+'.scaleZ', 1.0)
    mc.parent(nullNodeName, w=True)
    mc.parent(ctrlName, nullNodeName)
    mc.rename(nullNodeName, ctrlName+'_grp')

zeroOut()
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 을 선택해 주면 된다.



posted by cimple 2013. 8. 24. 14:41

C++ 과 Python 문법이 다르기에 Python 에서 Maya API 를 사용하는데 항상 헷갈린다.


몇 개의 예제를 통해서 사용법을 좀 알아보도록 하자.


Note : Maya Python API 2.0 이 출시되었는데, (maya.api.OpenMaya 로 import) 아직까지 지원 안되는 함수도 많은 것 같고 Document 도 엉망이고 좀 문제가 많은것같다.

안정화될때까지는 old version 의 Python API 를 사용하는게 맞을듯.



1. 선택한 Object 의 Dagpath 받아오기


import maya.OpenMaya as om  #import OpenMaya module

sList = om.MSelectionList()  #MSelectionList instance
om.MGlobal.getActiveSelectionList(sList)  #get the selection object list
dagPath = om.MDagPath()  #Dagpath instance
sList.getDagPath(0, dagPath)  #get the dagpath from 1st object of selection list


2. 여기에 이어 Camera 의 view direction 받아오기


camFn = om.MFnCamera(dagPath)  #MFnCamera instance
viewDirection = om.MVector()  #MVector instance
mspace = om.MSpace()  #MSpace instance
viewDirection = camFn.viewDirection(mspace.kWorld)  #Camera view direction in world space
print viewDirection.x, ' ',viewDirection.y,' ', viewDirection.z


간단한 예제들을 추가하면서, 사용방법에 대해 더 익숙해져 보도록 하자.

(그런데 Python2.0 에서는 문법자체가 다른것같은데...)

posted by cimple 2013. 8. 24. 13:36
def helloWorld():
    print "hello, world!"


블로그에 위와 같이 가독성좋은 스타일로 소스코드를 업로드하기 위해 이용할 수 있는 대표적인 방법이 SyntaxHighlighter 를 이용하는 방법이다.






설치방법은 검색해보면 다른 블로그에서도 충분히 설명이 잘 되어 있으니 굳이 여기서 다시 구체적으로 설명할 필요는 없을 것 같고,


(좋은 링크  : 'cocosoft' 님의 SyntaxHighlighter 소개글)


정말 간단하게만 설명하겠다.




1. SyntaxHighlighter 홈페이지 > Download 섹션에서 최신버전 다운로드

http://alexgorbatchev.com/SyntaxHighlighter/


2. 압축해제. 다양한 폴더가 나옴


3. scripts, styles 폴더 전체를 블로그에 업로드

(+ Tistory 유저라면 관리 페이지>HTML/CSS 편집>파일 업로드로 한꺼번에 추가 가능)

(+ 물론 필요한 언어팩과 스타일만 설치할수도 있지만, 용량도 몇KB 단위라 얼마 안되고 그냥 아 귀찮아 하는분들을 위해서...)


4. 스킨 HTML 파일 수정 

(+ Tistory 유저라면 skin.html 수정페이지에서 수정)

(+ SyntaxHighlighter 스타일은 header 부분에 추가. 볼드체 부분을 다른 스타일로 수정가능)

<link rel="stylesheet" type="text/css" href="./images/shCoreDefault.css">

(+ 사용할 언어팩 지정은 body 에서 수정. 물론 필요한 것만 추가해도 됨.)

<script type="text/javascript" src="./images/shCore.js"></script>

<script type="text/javascript" src="./images/shAutoloader.js"></script>

<script type="text/javascript" src="./images/shBrushAppleScript.js"></script>

<script type="text/javascript" src="./images/shBrushAS3.js"></script>

<script type="text/javascript" src="./images/shBrushBash.js"></script>

<script type="text/javascript" src="./images/shBrushColdFusion.js"></script>

<script type="text/javascript" src="./images/shBrushCpp.js"></script>

<script type="text/javascript" src="./images/shBrushCSharp.js"></script>

<script type="text/javascript" src="./images/shBrushCss.js"></script>

<script type="text/javascript" src="./images/shBrushDelphi.js"></script>

<script type="text/javascript" src="./images/shBrushDiff.js"></script>

<script type="text/javascript" src="./images/shBrushErlang.js"></script>

<script type="text/javascript" src="./images/shBrushGroovy.js"></script>

<script type="text/javascript" src="./images/shBrushJava.js"></script>

<script type="text/javascript" src="./images/shBrushJavaFX.js"></script>

<script type="text/javascript" src="./images/shBrushJScript.js"></script>

<script type="text/javascript" src="./images/shBrushObjC.js"></script>

<script type="text/javascript" src="./images/shBrushPerl.js"></script>

<script type="text/javascript" src="./images/shBrushPhp.js"></script>

<script type="text/javascript" src="./images/shBrushPlain.js"></script>

<script type="text/javascript" src="./images/shBrushPowerShell.js"></script>

<script type="text/javascript" src="./images/shBrushPython.js"></script>

<script type="text/javascript" src="./images/shBrushRuby.js"></script>

<script type="text/javascript" src="./images/shBrushSass.js"></script>

<script type="text/javascript" src="./images/shBrushScala.js"></script>

<script type="text/javascript" src="./images/shBrushSql.js"></script>

<script type="text/javascript" src="./images/shBrushVb.js"></script>

<script type="text/javascript" src="./images/shBrushXml.js"></script>

<script type="text/javascript" src="./images/shLegacy.js"></script>

<script type="text/javascript">

    SyntaxHighlighter.all();

</script>


5. 이제 사용하면 되는데 <pre> 를 사용하는 방법과 <script> 를 사용하는 방법이 있음.

<pre class = "brush: (언어)"> 

... source code...

</pre>


<script type="syntaxhighlighter" class="brush: (언어)">

...source code...

</script>


둘다 장단점이 있는데 그건 원래 홈페이지 Document 참고.

posted by cimple 2013. 8. 20. 14:41

포스트의 제목을 어떻게 지어야 할지 좀 난감하다. 쉐이링-렌더링에 대한 개념이 여전히 생소한 것들이 많아서... 하지만 재미있는 것을 알아내었기에 포스팅을 해야겠다.


포스팅의 결과물을 결론적으로 정리하자면


1. Shading Group 의 attribute 에 surface material / v-ray material 을 각각 등록할 수 있다.


2. 이렇게 함으로써, Maya Viewport 및 Software rendering 에는 원래 Surface material 을, V-ray rendring 시에는 V-ray material 을 사용할 수 있다.


이것이 유용한 이유는 지금 개발하고 있는 Photo-Projection Tool 에서 Viewport 상에서 Real-time 으로 Object 를 관찰할 때 사용하는 쉐이더와, 실제 렌더링에 사용되는 V-ray 쉐이더가 다르기 때문이다.


개념이 생소해서 그렇지 적용하는 방법은 몹시 간단하다.




1. HyperShade 의 Shading Groups 탭에서 지정해주고 싶은 쉐이딩 그룹을 선택한다. 쉐이딩 그룹에 대한 개념은 다른 포스트에서 따로 정리하겠지만, 여기서는 간단하게 기본적인 initialShadingGroup 에 적용시켜보기로 하겠다.



2. Attribute Editor 에서 상단의 Attributes 버튼을 클릭하면, V-ray > V-ray Material override 를 선택할 수 있다. 


3. 그러면 해당 Shading Group 의 Attribute 에 Extra Vray Attributes 탭에 추가된 것을 볼 수 있다.


4. 탭을 열어서, V-ray Material 에 내가 원하는 V-ray material 을 적용시켜 줄 수 있다.


5. 결과는 훌륭하다. Maya Viewport 및 Software Render 에는 기본 Surface material 로 지정해 준 lambert1 이 적용되고, V-ray 로 렌더링할 때에는 내가 새로이 만들어준 VRayMtlWrapper2 가 적용된다. 



Digital Tutors 정말 쓸모있다. GOOOOOD

posted by cimple 2013. 8. 19. 16:03

API 나 라이브러리 등을 보면 자주 보이는 것이 Virtual 함수를 통한 상속이다. 그냥 그런가보다 하고 쓸 수도 있지만, 정확한 개념을 알면서 사용하는 것이 좋다.


기본적으로 기억해야 할 개념은 Virtual 함수는, 객체지향 프로그래밍의 철학중 하나인 '함수의 다형성(polymorphism)' 을 위해 존재한다는 것이다.


'함수의 다형성'은 다시 한문장으로 정리하면 "동일한 명령에 대해서, 서로 다른 객체가 서로 다르게 수행한다" 라고 할 수 있다.


이는 이렇게 쉽게 설명할 수 있다. '도형' 이라는 부모 클래스를 가지고 있고, '삼각형', '사각형', '원' 이라는 자녀 클래스를 가지고 있을 때, 자녀 클래스에 모두 필요한 draw() 라는 함수를 구현한다고 하자.  같은 명령이지만, 각 객체가 다른 일을 하는, 다형성이 적용될 수 있는 좋은 사례이다. 


이 경우에 물론 각각 자녀 클래스의 인스턴스를 만들어 일을 수행할 수도 있지만, 부모인 '도형' 인스턴스를 자녀 클래스의 포인터 인스턴스로 만들수 있다.


Figure *fig1 = new Triangle;

Figure *fig2 = new Square;

Figure *fig3 = new Circle;


이렇게 만들면, Figure 라는 클래스 하나로 각각의 자녀 클래스들이 하는 일들 specific 하게 수행하는 인스턴스들을 만들어낼 수 있다. 좀 더 코드가 깔끔해지고 가독성이 분명해질 것으로 보인다. 이런 작업이 '함수의 다형성' 을 이용한 프로그래밍이다.


이럴 경우, draw() 라는 함수는 원래 Figure 라는 클래스에 무언가 형태를 가지고 있고, 실제로 실행될 때에는 Triangle, Square, Circle 안에 들어있는 draw() 함수에 맞게 각각 실행되어야 할 것이다. 이를 위해서 Figure 클래스 내부에


class Figure {

public:

virtual bool draw() = 0;

};


이런 식으로 virtual 키워드를 이요한 가상함수를 만들고, 각 자녀 클래스들은


class Triangle : public Figure {

public:

bool draw(){

...draw triangle...

}

};


각자 가지고 있는 draw() 함수로 일을 하게 되는 것이다. 이렇게 각각의 자녀 클래스 인스턴스에 맞게 함수가 실행되는 것을 '동적 바인딩' 이라고 한다.


위에서 예를 들은 virtual 함수는 정말로 아무런 일도 하지 않는 '순수 가상함수' 이다. 이런 순수 가상 함수를 가지고 있는 클래스는 '추상 클래스' 로서, 독자적으로 인스턴스를 생성할 수 없고, 딱 이러한 다형성을 목적으로 존재하는 클래스이다. 


참고링크 : '새-치킨-독수리' 예를 통하여 알기쉽게 Virtual 함수의 쓰임새를 설명해주신 좋은 링크

(http://pacs.tistory.com/19)


참고링크 : 위에서 설명한 도형 예제로 다형성과 Virtual 함수의 쓰임새에 대해서 설명해 주신 링크

(http://yagi815.tistory.com/220)


참고링크 : 왜 소멸자는 Virtual 로 만들어야만 하는가, 에 대한 링크. 

(http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tutorial&no=91)


간략하게만 설명하면, 위의 다형성 예제에서 생각했을 때, 부모 클래스의 소멸자를 Virtual 로 생성하지 않으면, 위의 예제처럼 자녀 클래스의 포인터로 생성했다면? 소멸자가 불려졌을 때? 자녀 클래스의 소멸자를 호출할 수가 없다. 그래서 Virtual 함수로 소멸자를 생성하면 자녀클래스->부모클래스 순으로 안전하게 소멸자가 호출된다.



posted by cimple 2013. 8. 18. 23:12

Vray for Maya Shader Programming


먼저 다음 문서를 참고하면 된다.


Vray for Maya Translator SDK


Warning: 문서에서도 알 수 있겠지만 Shader 말고 Mesh 등 다른 Object 를 만드는 과정과는 좀 차이가 있다. 하지만 일단 Shader 에만 집중해 보도록 하자.



Maya 에서 사용되는 Vray Shader 를 프로그래밍하기 위해서는 3가지가 필요한데,


1. Vray Plug-in (.dll)

2. Maya Plug-in (.mll)

3. Shader description file (.txt)


여기에서 2,3번 항목 색상이 다른 이유는, 생략될 수 (omitted) 있기 때문이다. 실제로 가장 중요한 것은 Vray plugin 하나이다. 

Maya Plug-in 을 개발하는 이유는 여기에 적절한 Maya UI 의 control interface 를 제공해 줄 수 있음 / Hypershade 에서 해당 shader 의 아이콘이 생성된다는 장점이 있으며,

Shader description file 은 Maya Plug-in 을 개발한다면 꼭 함께 작성해 주어야 한다.


V-ray plugin 하나만 작성하더라도, 작성후 컴파일한 다음 생성된 dll 파일을 Vray plug-in 폴더에 넣어주면, 'Create > V-ray > Create from V-ray Plug-in' 에서 찾아 해당 쉐이더를 생성해 줄 수 있다. (사실 이렇게 생성하면 되는데 Maya Plug-in 이 꼭 필요한 이유는 아직까지 미지수.)


구체적인 샘플 예제코드, 컴파일 방법, 테스트 씬 등은 추후에 계속해서 업로드 하도록 할 것이다.


(아 근데 Vray SDK 가 작년에 나온거라 참 자료가 없어도 너무없다. Mental ray 는 정말 양반이었음)


('Rendering의 개요' 라 하여 다른 대학교에서 자료로 만들어 둔 링크. 참 친절하고 알기쉽게 설명이 잘 되어있다. 아니면 어느 책에 나온 내용일수도?)

(http://bio.gsnu.ac.kr/~youknow/graphic/3DMAX_2.htm)

posted by cimple 2013. 8. 18. 19:12

환경설정 문제때문에 골치썩히는건 옛날인인가 했었는데, 아무래도 Windows 환경에서는 피할수 없는 숙명인가보다...


Maya 에서 사용하기 위한 Vray shader 를 짜기 위해서, Vray-Maya SDK 라는 것을 활용해야 한다.


메인 페이지는 여기 (V-ray SDK)

위에서 타고 들어갈수는 있는데 Maya 와 관련된 페이지는 여기이다. (V-ray Maya SDK)


V-ray for Maya 를 설치하면 /docs 라는 폴더에 도큐먼트가, /samples 라는 폴더에 SDK 샘플들이 있는데, 여기에 있는 예제들을 컴파일하는데 꼬박 이틀에 가까운 시간을 소모하였다.


결론은 'VS 2008로 컴파일하면 잘 됩니다'


Chaos Group(V-ray 회사) 에서 친절하게도(?) 각 SDK sample 에 Visual studio project 를 함께 동봉하고 있다. 

이걸 VS2010 환경에서 돌려보려고 무던하게도 애를 썼는데 원인모를 링크에러가 엄청나게 나를 괴롭히는 것이다. 에러로그를 좀 자세하게 읽어보니, 링크에러를 일으키는 부분이 내가 건드릴수있는 소스코드 레벨이 아니라, V-ray 에서 제공하는 스태틱 라이브러리 (.lib) 안에서 문제를 일으키고 있었다. (아니 뭐 어쩌라고;;)


백방으로 구글링을 하고 수많은 시도를 하다가 만난 고마운 사이트가 이미 외국에서는 굉장히 유명한 것 같은 Stack Overflow (http://stackoverflow.com/).


정말 C++ 입문자처럼 (사실 내 프로그래밍 실력이 뭐 입문자보다 일취월장했다고 볼수도 없지만) 에러메시지와 프로젝트 원본까지 올려가며 링크에러의 원인 및 해결방법을 물었다. 


그런데 돌아온 답변이, V-ray SDK 페이지에 가 보니 VS2010 환경은 지원하는 컴파일 환경이 아니라는 것. V-ray 라이브러리들이 컴파일된 MSC(Microsoft Compiler) 버전이 다르므로 이것을 VS2010 환경에서 컴파일하려는 것인 Very Bad Idea 라는 것이다.


그래서 VS 2008 을 설치한 뒤, Release 모드에서 컴파일하니 성공.



휴... 정말 힘들다. 이제 Linux 환경에서 컴파일해야 할 텐데. (V-ray 리눅스버전이 없어서 일단 Windows 에서 작업중) 이것보단 쉽겠지.