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의 트위스트한 묘한 매력에 빠지는 것은 당연한 것 같다.

Sunday, January 24, 2010

What is Micropolygon?(1)

흔히 RenderMan을 Micropolygon-based renderer라고 한다. Reyes algorithm renders를 조금이라도 접했다면 'Micropolygon' 이 단어를 정말 귀청 떨이질 정도로 들었을 것이다. 많이들 듣고 얘기를 하지만 사실 이 녀석이 뭔 놈인지, rendering시 다른 process와 연관되어 어느만큼 중요한 부분을 차지하는지 정말 이해하고 쓰는 이는 많지 않다고 생각된다. 그냥 아주 작은 rendering되는 최소 geometry 단위(the common basic geometric unit of the algorithm)라는 정도로 생각하지 않을까....

Reyes algorithm의 꽃 중에 하나가 그 제각기 크기와 성격이 다른 geometry에서 micropoylgon으로 통일화 되어 가는 여정일 것이다.(The Reyes algorithm is in essence a micropolygon-centered algorithm) 이 micropolygon이란 단어는 micro-bilinear-patch의 줄임 말이다. 전에는 더 복잡한 flat-shaded sub-pixel quadrilateral이란 단어로 쓰이기도 했었다. 직역해 보면 '평면의 쉐이드된 한 픽셀보다 작은 사변형'이라고 나름 해석 할 수 있겠다. 다시 말하면 한 pixel의 반보다도 작게 쪼개 질 수 있는 four vertices로 구성된 사변(four-sided)의 polygon(quadrilateral facet)이다.(tiny bilinear patch or facet 이라고도 함) 뭐 말만 붙이면 넘 더 복잡해지니..... 쉽게 얘기하면 아주 아주 작은 삼각이 아닌 그냥 사각의 쌍 직선의(bilinear) 두 edges로 이루어진 polygon이다.

늘 평면을 유지하는 triangle mesh를 기본 Rendering 단위로 쓰는 ray tracing-based renderers와 달리 micropolygon은 사각으로 되어 있기에 경우에 따라 flat 하지 않을 수 있는 상황에서 오는 error를 가질 수 있지만 pixel보다 작아지는 상황에서는 그냥 무시되는 error일 뿐이다. 그럼 왜 사각형으로 선택을 했을까하는 의문을 가질 수 있겠는데 이는 parametric geometry을 sub-divide하기에 가장 용이한 형태이기 때문이다. (단, polygon만 제외)

micropolygon의 바로 전 단계 형태인 grid라는 놈을 빼놓고 얘기 할 수는 없다고 보는데, a grid는 각각의 micropolygon으로 분리 시키기전의 micropoygon을 그룹 시켜논 bicubic subpatch이다.(A grid is a tessellation of the primitive into a rectangular array of quadrilateral facets(= micropolygon facets) and a bunch of large rectangular arrays of floating-point-numbers) 사실 shading단계까지는 이 migropolygon의 덩어리인 grid 단위로 계산이 이루어지고 rendering과정이 거의 끝나갈 무렵인 모든 shading조차 끝난 상태에서 그 grid가 각각의 조각인 micropolygon으로 분리 독립이 되어 한손에는 Ci 값을 다른 한손에는 Oi값을 네 vertex마다 쥐어 주고 최종 hiding과 sampling 공정으로 보내지게 된다. (사실 micropolygon을 부를때 shaded micropolygon이라 불러야 더 정확하지 않을까 한다.) grid 단위로 shading 계산이 이루어진 이유는 당연 계산의 효율성 때문인다. 즉 이웃한 micropolygon끼리 공유된 vertex를 한번에 renderman shading engine의 심장인 SIMD virtual machine으로 보내져 shading계산을 할 수 있기 때문이다.

Anyway! 다시 micropolygon쪽으로 돌아 오면,
우선 그 그렇게 작은 크기에서 오는 장점부터 얘기를 해보겠다. (한 픽셀의 반보다도 작게 쪼개 진다는 말은 정말 CG세계의 마이크로 세계의 단위라고 말 할 수 있을 만큼 정말 정말 작은 단위이다.) 이는 크게 네가지의 장점을 만들어 준다.

첫번째로, 최초 geometry(polygon은 제외)의 곡율를 가장 가깝게 전달, 재현해 줄 수 있고( 게다가 veiw dependent),
두번째로, Nyquist limit으로 올 수 있는 artifacts를 지오메트리 단계에서 부터 해결해 줄 수 있고,
세번째로, shading과정에서 displacement에 의한 vertex의 재배치에 자유로움을 주게 되고,
마지막으로, shading을 현존하는 렌더러중 현실과 가장 가까운 단위 면적으로 빛과 표면의 반사되는 관계를 계산해 내어 정확한 color값을 구할 수 있다는 것이다.(interpolation만 의지 한게 아닌)  계속......

Saturday, January 9, 2010

Why RenderMan needs Displacement Bounds?

왜 renderman류의 renderer에서만 displacement bound 옵션이 있을까? 라는 물음으로 시작하겠다. 이 옵션의 역활은 단순하다. 말 그대로 해당 geometry의 bounding box 사이즈를 정의된 unit단위로 늘리는 것뿐이다. 그럼 왜 bounding box 싸이즈를 displacement 되어 움직여지는 grid vertices 만큼 늘여야만 하는 것일까? 첫번째 이유는 bucket단위로 독립적인 rendering을 하기 때문이고 그 bucket안에 geometry가 안에 있냐 밖에 있냐를 계산할때 bouncing box 단위로 체크를 하기 때문이다.

두번째 이유는 displacement는 shading과정에서 계산되어지기 때문이다. shading을 하기 전까지는 이 grid상태의 micropolygons vertices이 후의 과정인 displacement shading에 의해 어디로 튈지 모르기 때문에 렌더링 초기 과정인 bucket안에 들어와 있는지 여부를 (bounding box 단위로 check & culling) 확인할때 그 bounding box 싸이즈를 크게 하여 계산되고 있는 bucket안에 들어오게 하여 실제 계산인 쉐이딩 까지 그 데이타를 계속 끌고 오게 만드는 것이다. 이 옵션은 상당히 비 계산적인 방식으로 조절해야 하는 것이 사실이다.

그럼 이런 비 계산적인 방식 말고 정확하게 계산해여 displacement bound value를 얻을 수 없는 것도 아니다. extremedisplacement attribute을 씀으로써 정확한 값을 뽑아 올 수가 있다. 이 방식은 먼저 해당 geometry마다 displacement shading을 연산하여 정확한 displacement bounds 값을 산출하여 제공하므로써 메모리를 낭비하는 것을 방지하는 것이다. shading을 먼저 한다는 것 또한 rendering 과정에 상당한 부담을 줄것이지만 어떤 경우에는 이 부담을 안고서도 정확한 값을 필요로 하기에 이 attribute가 있는 것이다. 흔히 Extreme Displacement가 이루어질때 이것이 효과적으로 쓰이기 되는데 Extreme 같은 경우에는 보다 정확한 displacement bounds value가 요구되어 진다. 잘못 쓰인 값은 엄청난 메모리 낭비로 직결되기 때문이다.

Friday, January 8, 2010

Shading Rate vs. Pixel samples in Renderman.

"Decoupling between shading and sampling in RenderMan."

Renderman rendering과정(REYES Algorithm)을 크게 둘로 나눈다면 shading rate가 영향을 받는 부분 까지와 이후 영향을 안받는 나머지 후반 부분, 즉 pixel sampling이 지배하게 되는 단계로 나눌 수 있겠다. 이 두단계를 서로 영향 안받게 만듬으로 RenderMan은 pixel sampling(super sub-sampling)에 자유로움을 갖게 되었다. 이는 모든 Renderer의 최대의 적 aliasing issue에 대해 보다 자유로워 질수 있고 많은 투자 없이도 좋은 quality로 final pixel까지 가게 해 주었다. 더 나가 motion blur와 DOF에서 요구되는 충분한 samples을 얻는데 쉽게 갈수 있는 길을 열어 주었고 할 수 있겠다.

하드웨어 사용면에서 보면, 이로써 shading과 hidden surface calculations와 분리를 하였기에 많은 부하를 줄일 수 있게 됐다. shading 과정에는 메모리 먹는 괴물 texture가 포함되어 있기에 sampling 과정에서 나오는 또 다른 메모리 포식자 visible point lists와 분리 시킴으로써 효울적인 메모리 관리가 가능하게 된 것이다.

이런 완전, 완벽한 분리는 RenderMan같은 종류의 Reyes Renderer에 pure ray-tracing renderer 가 따라 올 수 없는 많은 독특한 특징을 지어준다고 볼 수 있다.

단점으로는 미리 shading 되어 있는, 차려진 밥상에서만 가지고 a pixel안에서 sub-sampling이 들이가기에 painted texture 와 procedural texture에 high frequency 지역에서 aliasing이 방치되게 된다. sub-sampling으로 쪼개진 만큼 texture 또한 같은 sampling이 이루어져야 하는데 이미 shading에서 끝나 버렸기에 돌아 갈수가 없는 것이다. (참고로 모든 신호 체계는 reconstruction단계에서 Nyquist sampling 법칙에 의해 두배이상의 sampling을 요구한다.) 그래서 미리 high frequency를 신호를 막기위해 RenderMan은 pre-filterd texture를 쓰게 된다.

procedural texture는 얘기가 더욱 복잡해 지는데, 선분 하나 그어도 filtering을 shading script차원에서 미분까지 들쳐 가면서 만들어 줘야 하기에 그리 간단하지 않은 것이다.

반면 일반적인 Ray-tracing Renderer들은 지금 얘기와 반대로 이해하면 될것이다. 그러기에 다른 renderer에서는 super sub-sampling위해 primary sample 수를 늘려주는 만큼 드라마틱하게 rendering time이 늘어나게 되는 것이다. 물론 나름대로 primary sample 수를 줄이기 위해 여러 대처 방식(예:Adaptive sampling)으로 그 늘어난 시간과 메모리를 효율적으로 만들려고 노력하지만 근본적인 구조의 디자인이 다르기에 쉽게 Renderman같은 효과를 못 내는 것이다.

Monster Inc.부터 쓰이기 시작한 Deep shadow maps이 renderman에서 그리 많은 추가 비용이 필요 없이 효울적인 사용이 가능한 것도 Decoupling between shading and sampling의 프로세서를 가지고 있기 때문이다. deep shadow maps의 주요 특징중에 하나가 기존의 한 pixel에서 한 sample만 가능 한 traditional shadow map과 달리 sub-sampling이 가능하여 fur같이 pixel보다 작은 geometry의 detail을 놓치지 않고 shadow 생성 할 수 있는 것이다. 다시 말하면 shadow camera에서 depth map을 생성시 shading단계까지 오는 micropolygons 생성 과정이 traditional shadow maps과 deep shadow maps방식은 같고 shadow map이기에 당연히 shading은 생략을 하면서 sampling 단계 부터 서로 다른 길을 가게 되기에 reyes의 Algorithm을 갖고 있는 renderer는 부담 없이 deep shadow maps을 더 정확하게 효율적으로 쓸 수 있게 된 것이다. 이외에도 정말 환상적인 어드밴스 기능이 많은 deep shadow maps이기에 다음 기회에 이것만 갖고 더 자세히 얘기하기로 하겠다.

참고로 Mental ray도 이같은 방식의 shadow map을 지원하지만(called: detail shadow map), 어떻게 진행 시키는지는 잘은 모르지만(알 수가 없음) renderman과 같은 결과는 기대하기 힘든 것 같다.

Tuesday, January 5, 2010

Nyquist sampling.

Normally, the Nyquist sampling theorem(proposed by Harry Nyquist in 1928) states that for adequate sampling, the sampling frequency needs to be twice or more than the highest frequency in the input signal.


모든 3D rendering과정은 signal processing에서 sampling과 reconstruction의 과정과 같다고 해도 과언이 아니라 생각한다. 이 sampling 얘기만 나오면 하는 얘기 중에 하나가 Nyquist sampling 원리일 것이다. 그만큼 중요하기에 여기 짧은 글이나마 올려 본다.

signal processing을 통한  Anti-Aliasing 부분은 3D CG rendering에서 너무도 중요한 부분이다. 이 신호 체계의 기본 컨셉을 이해 해야 왜 그렇게 rendering뿐만 아니라 이곳 저곳에서 짜르고 미리 나누고 미리 막고 sampling하고 sub-sampling하고 filtering 해야 하는가를 이해 할 수 있을 것이다. 나중에 기회 있을때 이런 신호체계에 대해 더 자세히 얘기해 보기로 하겠다.