Search

'Game Dev./Shadows'에 해당되는 글 4건

  1. 2008/03/05 Boundary of Shadow Techniques (6)
  2. 2007/08/20 Variance Shadow Map (3)
  3. 2007/04/20 Realtime Shadow Mapping in a Large Environment (7)
  4. 2006/07/14 Trapezoidal Shadow Mapping

Boundary of Shadow Techniques

Game Dev./Shadows 2008/03/05 22:29 Posted by sonee
사용자 삽입 이미지

예전 D2 프로젝트를 진행하고, 지금 3D 야구게임 프로젝트를 하면서 저는 계속 라이팅과 그림자와 싸워왔습니다.-_-

그림자의 경우 간단한 프로젝션 쉐도우부터 쉐도우 볼륨, 스텐실 쉐도우, PSM, TSM, LISPM, CUBEMAP SHADOW 등 여러가지 방법을 테스트하고, 게임에 적용해봤습니다.
Self Shadow 의 경우에는 Aliasing 때문에 정말 고생을 많이 했군요. 간단히 블러를 먹여도 보고, GRADIENT, VSM, SIMD, JITTER 등 여러가지를 시도해보았으나 OutDoor 를 하나의 텍스쳐를 사용하여 셀프 쉐도우로 표현하는 것은 결국 무리라고 최종 마무리를 지었습니다. 결국 CSM이나 PSSM 같은 방법이 그나마 OutDoor 에서 퀄리티 높은 그림자를 보여주네요. 그렇지만 지금 만들고 있는 야구게임같이 카메라의 줌인/아웃이 자유로운 상태에서는 CSM이나 PSSM 조차도 한계를 보입니다. double-precision 을 사용한다 해도 해결될 수 있는건 아니지요.

사용자 삽입 이미지사용자 삽입 이미지


이전에는 그림자기법을 개발하면서 이러한 OutDoor에 최적화된 최신 기술을 도입하면 좀 더 나은 퀄리티를 보여줄 것이다라는 기대를 하며 개발을 진행했는데, 이제와서 그림을 그려보면서 여러가지 쉐도우 기법 알고리즘을 표현해보니 역시나 지금 만드는 야구 게임에서는 위에 열거한 그림자 기법으로는 Aliasing 을 피할 수 없다라는 결론에 도달했습니다. 그럼 어떻게 해결할 수 있겠는가? 라는 질문을 하게 되는데 결국 각 장면에 최적화된 꽁수를 사용하는 방법밖엔 없겠다 라는 생각이 드는군요.

Self Shadow의 경우 Light 에서 바라본 화면에서는 10pixel 을 차지하지만 실제 카메라로 바라본 화면에서는 10pixel 보다 훨씬 많은 부분을 차지하기 때문에 1:1 대응이 되지 않으므로 이러한 기법으로는 아무리 여러가지 방법(편차,보간,경사도)을 사용한다 해도 Aliasing 을 피할 수 없습니다.
그나마 그림자 텍스쳐의 해상도가 클 수록 Aliasing 을  줄일 수 있고, 결국은 CSM, PSSM을 연동하면 되겠다 싶지만 카메라 줌인/줌아웃때문에 역시나 고민이 되는건 마찬가지군요.
카메라 줌인을 하게 되면 화면에 보여지는 영역은 좁아지지만, 화면 안에 들어온 오브젝트는 멀리 있는 오브젝트도 크게 보이고, 가까이 있는 오브젝트도 크게 보이기 때문에 두 오브젝트의 그림자 퀄리티를 만족시키기에는 여간 힘든게 아니네요. 특히나 얼굴만 아주 크게 클로즈업 되는 경우에는 아주 죽을맛입니다. 클로즈업 한 캐릭터의 얼굴 옆 공간에 200미터 뒤에 수비수의 얼굴도 크게 나오거든요..-_-

사용자 삽입 이미지


여튼 realtime으로 SelfShadow 를 사용해야 한다면 다음과 같은 솔루션에 도달하게 됩니다.

1. Diretional
 - CSM + (VSM, GRADIENT)
 - PSSM + (VSM, GRADIENT)
 - TSM, LISPM + (VSM, GRADIENT)

2. Spot
 - (TSM, LISPM, PSM) + (VSM, GRADIENT, JITTER)

3. Omni(Point Light)
 - Cubemap Shadow

(stencil을 사용하는 경우에는 칼같은 그림자가 보기에 그닥-_- 이쁘지 않으므로 제외합니다)

Cubemap shadow는 별다른건 없고, 걍 해당 라이트 기준에서 6방향으로 환경맵 만들듯이 찍어주면서 깊이를 텍스쳐에 기록합니다. 그리고 변환 matrix를 만들어서 uv 를 계산하여 처리합니다.

위의 솔루션은 직접 테스트하면서 얻은 데이터와 여타 다른 게임들을 분석하면서 얻은 결과 입니다.

realtime에서는 매 장면을 그릴때마다 그림자를 업데이트해줘야 하는 까닭에 퀄리티를 희생하고, 속도를 높이는 알고리즘으로 발전이 되어 왔습니다.
그러나 하드웨어의 발전 속도와는 다르게 그림자 기법은 크게 발전하지 않았는데 어쩌면 지금까지 사용했던 텍스쳐에 라이트로 바라본 이미지 그리기를 버리고, 새로운 기법을 찾아보는 것이 맞을 지도 모르겠네요.

Variance Shadow Map

Game Dev./Shadows 2007/08/20 00:10 Posted by sonee

정말 지긋지긋한 Self Shadow의 Aliasing 에서 벗어나고 싶어 죽겠네요 ㅠㅠ
PCF+Gradient 로도 너무 눈에 크게띄고,
결국 PSSM(Parallel Split Shadow Map)과 VSM 을 섞어봐야 하는건지 ㅠㅠ
Unreal 3에서도 Aliasing은 피하지 못했으나 눈에 잘 띄진 않더군요.

여튼 VSM 에 대한 링크 자료 첨부합니다;-_-

http://developer.nvidia.com/object/variance-shadow-maps-gdc-2006.html

TAG VSM

사용자 삽입 이미지

PSSM Screenshot


오랜만의-_- 게임개발 포스팅이네요

최근 3D 게임들의 그림자 추세는 실시간으로 화면에 보이는 모든 객체들을 업데이트하는 방식으로 흐르는 듯 합니다. 최근에 나오는 여러 그림자 관련 자료들도 이러한 넓은 영역의 쉐도우 매핑에 대해 나오고 있구요.

화면에 보이는 모든 객체들을(사실 화면에 보이지 않아도 Shadow Caster 가 Receiver 에게 영향을 주는 객체도 포함이겠죠) 텍스쳐에 렌더링 해야 한다는건데 텍스쳐 맵이 아주 크지 않는 이상 일정 퀄리티 이상을 보긴 힘듭니다.

TSM, LISPM 등으로 가까이 있는 오브젝트의 그림자는 높은 해상도로, 멀리 있는 오브젝트는 낮은 해상도로 처리로 처리하는 기법이 나오게 되었는데, 사실 금세 한계에 부딛혀 버리는데요(저도 LISPM 을 쓰고 있습니다 ㅠㅠ)
그래서 걍 무식하게 텍스쳐 맵을 더 쓰지 뭐! 하는 쪽으로 흐르는듯 합니다. 이미 최근에 나오는 수 많은 게임들이 적용되어있죠.

해당 방법을 사용한 몇 가지 그림자 기법들에 대한 자료를 링크합니다. 보통 Directional Lighting에 이러한 기법을 사용하고, Point Lighting 에는 기존에 LISPM 이나 TSM 을 사용하는듯 하네요.

http://hax.fi/asko/PSSM.html
http://appsrv.cse.cuhk.edu.hk/~fzhang/pssm_vrcia/shadow_vrcia.pdf

Cascade Shadow Mapping 도 볼만한데 링크는 못찾겠네요. ShadowX5 에 내용이 잘 나와있습니다.

TAG 그림자

Trapezoidal Shadow Mapping

Game Dev./Shadows 2006/07/14 19:30 Posted by sonee
지난 며칠간 TSM 을 연구하고, 게임 적용에 성공하여 잘 사용하고 있다.
그러나 넓은 영역을 하나의 쉐도우 맵에 포함하여 사용하려니 생각보다 퀄리티가 잘 나오지는 않는다.
가장 큰 문제는 Depthbuffer의 Aliasing 이다.
Gems4 에 ID+Depth 가 소개가 되어 있는데 아직 적용은 해보지는 못했고, depth buffer interpolation -_- 만 기대하고 있다.
여튼 PSM 에 비해 가까이 있는 오브젝트의 경우 그림자 퀄리티가 나아져서 나름 괜찮아 하며 만족중-_-

스샷은 회사-_- 이미지라 올리진 못하고
참고한 링크를 남긴다~
TSM 링크는 이전 글에 있고, 추가로
http://developer.nvidia.com/object/shadow_mapping.html
http://developer.nvidia.com/object/Projective_Texture_Mapping.html
http://developer.nvidia.com/object/hwshadowmap_paper.html

이건 Parallel split shadow maps -_-
http://hax.fi/asko/PSSM.html
TAG 3d