Tuesday, January 26, 2010

Number of Samples in Mental Ray vs. Shading Rate in RenderMan

Number of samples and shading rate는 각각 Mental ray와 RenderMan에서 Quality를 결정하는 가장 큰 영향역 있는 render global 옵션이기에 비교를 해 보았다. 이 두가지를 비교 이해 한다면 두 렌더러의 근본적인 차이점을 이해 하게 될거라 생각든다. 하나는 상용 ray tracing 방식에서 다른 하나는 상용 reyes scanline 방식에서 각각 탑클래스를 달리는 renderer라고 봐도 무방하다.

아마도 많이들 궁금해 할것 이라 생각드는 것 중에 하나가 Renderman에 있는 shading rate라는 option이 Mental ray에는 왜 없는지가 아닐까 생각한다. shading rate는 말 그대로 shading하는 단위의 크기를 정의 하는 것이다. Renderman은 한 grid에 붙어 있는 모든 Micropolygon의 4개의 vertex를 shading 하므로 Micropolygon의 크기가 shading rate가 된다. 고로 shading rate는 Micropolygon을 screen 상에서의 크기를 정의 하는 옵션이 되는 것이다.(정확히 어떻게 크기가 결정되는지는 어느 renderman 책에나 잘 나와 있으니 패쓰) 반면 Mental ray에서는 전형적인 pure ray-tracing renderer가 그렇듯이 primary ray로 sampling 되는 곳이 shading 하는 곳이 되기에 shading rate라는 옵션이 필요 없는 것이다. 그러므로 sample 개수가 곧 shading rate와 같은 정의를 내리게 되는 것이다. 반면 Renderman에는 Mental ray와 마찮가지로 Number of samples 옵션과 shading rate 옵션이 모두 다 있는데 이는 Renderman은 sampling이 별개로 shading과 독립되어 있기에 양쪽의 옵션이 필요하게 된 것이다. 다시 말하면 sample 개수를 늘려도 렌더링 시간에 큰 영향을 안받는다는 것이다. 너무도 너무나 무지 무지 중요한 얘기다. (이부분이 이해 안간다면 아래 전에 쓴 글들을 참조하기 바란다.) 다시 mental ray로 넘어와서, 이와는 달리 멘탈레이는 sample의 개수의 증가는 첫 출발지인  primary ray의 개수의 증가로 바로 이어지면서 늘어난 만큼 intersection tests와 shading 할 포인트 증가로 바로 직결 되어 렌더링 타임이 power곡선을 그리 듯 늘어나게 되는 것이다.

다시 정리해보면 랜더맨은 sampling을 거의 끝물에 shading과 상관없이 독립적으로 실행되고 멘탈레이는 sampling이 시작점에 위치해 primary ray 쏴주는 개수가 되므로 앞으로 있을 모든 렌더링 계산에 영향을 미치게 되는 것이다.

그런 이유로 랜더맨은 sampling이 부수적인 옵션이 되고 shading rate가 메인 옵션이 된것인 반면 맨탈레이는 shading rate라는 옵션이 아예 없이 sampling 옵션만 있는 것이다.

이렇게 sample 개수의 증가를 두려워 하는 맨탈레이는 이를 덜기 위한 선택으로 adaptive sampling 방식을 도입해 쓰게 된 것인데 이는 contrast 기준으로 통해 sample 개수를 통제하는 것으로 콘트라스트가 낮은 지역이면 변화가 적어(low frequency) 작은 샘플 수로도 충분히 픽셀화 시킬 수 있고 콘트라스트가 높은 지역(High frequency)에서는 많은 변화가 있다는 뜻으로 그 변화를 다 캡쳐 하기 위해서는 더 많은 샘플 수가 필요로 하기에 콘트라스트에 따라 샘플 수의 개수를 조정 한게 되는 것이다. 그래서 맨탈레이는 min sample level와 max sample level가 존재하는 것이고 contrast threshold 옵션을 통해 그 콘트라스의 기준을 움직이는 것이다.

이처럼 adaptive sampling 방식은 주로 ray를 동시 다발적으로 쏴야 하는 경우에 계산시간을 더 빨리 낭비 없이 히기 위해 이곳 저곳에서 많이 쓰이는 방식으로 널널한곳은 널직하게 하면서 밀집한 곳을 집중 공략하는 방식이라 할 수 있겠다. 예를 들면 ambient occlusion과 color bleeding 계산 할때도 쓰일 수 있겠는데 여기에 하나더, a cosine-weighted라 하여 cosine의 곡선을 이용해 hemisphere에서 90도가 되는 normal주위에 더 많은 rays를 쏘고 0도나 180도로 가는 끝부분에서는 적은 양의 rays를 쏘게 하여 더 효율적으로 계산 할 수 있게 만드는 기능이 첨가 되어 있다. 어떻게 해서든 ray수를 줄여가며 효율적으로 sampling 부족으로 인한 anti-aliasing 극복 하느냐가 ray-tracing algorithm의 계속 풀어 나가야 하는 숙제 중에 하나 인 샘이다.

그럼 renderman에서도 adaptive sampling 방식을 쓰면 더 빨라 지지 않겠냐는 의문을 가질 수 있겠는데 사실 adaptive sampling이 자체의 구현이 빠른게 아니다. sampling rate를 요구에 따라 바꿔주어야 하는 계산과정이 있기에 그러한데 ray-tracing rendering에서는 워낙 intersection tests가 비싸기에 adaptive sampling방식으로 ray sample 개수를 줄이는게 더 효과적이기 때문에 쓰는 것이다. 그래서 추가 sampling 비용이 필요 없는 renderman에서는 구지 이 비용이 더 드는 adaptive sampling을 쓸 이유가 없고 대신 간단한 jittered sample distribution 방식을 써 한 픽셀안에서 일률적인 수의 sampling을 하게 되는 것이다.

알면 알아 갈수록 renderman의 트위스트한 묘한 매력에 빠지는 것은 당연한 것 같다.

3 Comments:

Blogger vfx said...

좋은 글 잘 보고 있습니다... 제게 꼭 필요한 시점에 있는 글들이라 계속 찾게 되네요.. 감사합니다.

January 28, 2010 at 4:28 AM  
Blogger shrmrxo said...

안녕하세요...장교수님 연구실에서 작업하던 노극태입니다..좋은 글 구경하고 갑니다..가끔 들러도 되겠죠?

January 31, 2010 at 10:15 PM  
Blogger horizonfisher said...

들려주셔서 감솨해요.^^ 부족한 글들만 올리지만 언제 든지 들리세요. 힘 닿는 한 계속 업데이트 할 예정입니다.

February 1, 2010 at 2:48 PM  

Post a Comment

Subscribe to Post Comments [Atom]

<< Home