Tuesday, August 18, 2009

Mid-point (or Mid-distance) depth shadow

mental ray의 숨겨진 mid-point 옵션에 대해 바로 전에 얘기를 했는데 생각 난김에 한번 정리를 해보고 넘어 가보도록 하겠다. (참고로 maya에서는 mid-distance로 renderman에서는 mid-point라고 부른다.)

depth map을 이용한 shadow 방식에서 가장 이슈화 된 것은 늘 최적의 값으로 맞춰 주어야 하는 shadow bias 일 것이다. 늘 일정치 않은 값으로 매번 조절을 해야 한다는 것, 그것도 rendering을 걸어 봐야 확인이 가능하다는 것 때문에 lighting artist들에게 이만 저만 귀찮은 존재가 아닐 수 없다.

shadow bias는 shadow camera origin에서 rendering된 z-depth value image를 가지고 rendering 할 real camera에서의 distance 값을 같은 좌표계로 변환해서 거리 값을 비교 할 때 shadow z-depth 값을 (+) 쪽으로 살짝 밀어 너어 겹치지 않게, 즉 self-shadowing이 않나오도록 하는 옵션으로 값이 너무 높으면 object와 유격이 일어 나기에 늘 가장 타이트한 값을 선택해 주어야 한다.

가장 이상적인 shadow를 shadow map에서 얻을 수 있는 방법은 shadow camera coordinate space에서 X,Y 축으로 타이트하게 만드는 것 뿐만 아니라 Z축으로도 타이트하게 만들어 허용 할 수 있는 가장 큰 범위의 Z-depth contrast를 얻어 내어 real camera depth 값과 비교 하게 만드는 것이다. 이는 shadow camera에서 near/far clipping plane을 조절 하므로써 가능하게 되는데 아쉽게도 maya와 mental ray는 자동적으로 shadow camera에 들어온 objects의 bounding boxs를 체크해서 clipping 하는 auto-focus 기능만 지원한다. (경험상 이 같은 auto 기능들은 쉽고 편리함을 주지만 늘 문제의 원인이 되는 경우가 많다.)

간단한 테스트를 해본다면 renderman에서 box object를 작게 만들어서 depth map shadow를 뽑아 렌더링 해본후 다음번엔 그 box를 10배 이상 키워서 렌더링 해보면 shadow가 어떻게 바뀌는지 보일 것이다.

자, 그럼 본론으로 들어가자. 이런 shadow bias의 불편함으로 벗어 나기위해 생각 해 낸 것이 mid-point depth map shadow방식이다. woo algorithm이라고도 불리는데 bias free로 zero bias 값으로도 self-shadowing 이슈 없이 shadow를 만들어 낼 수 있는 방법이다. (renderman에서는 과거 디즈니의 다이노소어 영화에서 처음 소개 되었다.)

원리는 아주 아주 간단하다. shadow depth map을 두 장 rendering 하는데 하나는 기존과 같은 방식으로 그리고 다른 하나는 obejcts의 back-facing 면만 보이게 한후 depth 값을 rendering 하여 이 두 depth maps을 가지고 중간값(mid-point)만 갖는 제 3의 depth map을 만들어 이를 shadow에 쓰면 bias free가 되는 것이다.

내가 좋아하는 간단하면서도 좋은 아이디어이지만 여기에도 단점이 따라다니게 된다. 디테일이 필요하는 상황(예: hair)에서는 geometry의 중간 값을 얻기가 힘들어 지기에 무리가 따르고 어떤 특정한 geometry상황(예: 갑지기 안으로 들어가 깊은 구덩이를 만드는 상황)에서도 중간 값을 못찾아 에러를 낸다는 것이다. 그래서 영화 파이널판타지에서는 이런 상황 때문에 depth map shadowing을 위해 extra geometry를 만들어 미리 메꾸어야 하는 extra work을 해야만 했었다고 한다.

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home