Contents |
Introduction
우리가 일반적으로 생각하는 영상의 어두운 부분은 사실 음영(陰影), 즉 그늘(陰)과 그림자(影)로 나뉘어져 있다. 이 둘은 엄연히 다른 것이다. 그늘은 빛이 닿지 않아 생기는 어두움이고, 그림자는 다른 물체에 의해 빛이 차단되어 생기는 어두움이다. 그늘은 기본 렌더링 파이프라인에서 자연스럽게 생기지만, 그림자는 무언가 별도로 처리를 해서 생성해 주어야 한다. 그림자를 그리는 방법은 크게 세 가지 방법이 있다 : Projected Texture Mapping, Shadow Volumes, Shadow Maps. 하나하나 설명해 보기로 하자.
Projected Texture Mapping
90년대 3D 게임에서는 캐릭터의 발 밑에 둥그런 검은 원을 깔아주는 방법을 사용하였다. 하지만 이 방법은 캐릭터의 모양이나 움직임에 관계 없이 그림자의 모양이 일정하기 때문에 현실성이 떨어졌다. 이 방법을 보완하기 위해 만들어진 것이 Projected Texture Mapping으로, 광원에서 물체의 실루엣을 텍스쳐에 그려 광원 위치로부터 물체의 뒤에 있는 배경에 투영하는 방법이다.
이 방법의 장단점은 다음과 같다:
- 거의 모든 GPU에서 지원하기 때문에 호환성이 높다는 장점이 있다.
- 두 개의 물체가 서로 상대방에게 그림자를 드리우는 상호 투사 그림자 표현이 가능하다는 장점이 있다.
- 자기 자신의 그림자가 자신에게 그려지는 Self Shadow를 표현할 수 없다는 단점이 있다.
Shadow Volumes
점광원에 의한 실시간 그림자를 그리는 알고리즘이다. 우선 시점에서 렌더링을 한 번 해서 Z-Buffer를 뽑아 낸다. 그 다음 광원에서 바라본 물체의 윤곽(shlhouette edge)을 이루는 정점들을 잡아 이를 빛의 진행 방향으로 잡아늘인다. 이 잡아늘여서 생긴 다면체를 Shadow Volume이라고 부른다 (Crow, 1977). 다음, 이 Shadow Volume이 포함된 장면을 카메라 시점에서 렌더링을 해서 Stencil Buffer에다가 그려내면서 어떤 부분이 그림자가 진 부분인지 결정하는데, Depth Pass(z-pass) 알고리즘과 그 이후에 발견된 Depth Fail(z-fail) 알고리즘이 있다. 전자는 Depth buffer의 뒤에 있는 shadow volume을 가지고 그림자를 만드는 방법인데, 시점에 따라 shadow volume이 적당히 clipping 처리 되지 않으면 멀리 늘어지는 그림자가 중간에 짤리는 문제가 있다.[1]
이 방법의 장단점은 다음과 같다:
- 상호 투사 그림자를 표현할 수 있다는 장점이 있다.
- Self Shadow를 표현할 수 있다는 장점이 있다.
- 그림자 생성 단위가 다각형 단위로 한정되어 버린다는 단점이 있다. 예를 들어 직사각형 메쉬에 나뭇잎 모양의 텍스쳐 (나뭇잎 바깥 부분은 alpha가 0인)를 올려 나뭇잎을 표현한다고 할 때, 이것의 그림자는 직사각형의 투영이 될 것이다.
- Shadow Volume 생성이 비싸다는 단점이 있다. 어느 정점이 물체의 윤곽을 이루는지 확인하는 방법이 까다롭기 때문에 보통은 모든 정점을 다 집어넣고 Shadow Volume을 만들곤 했기 때문이다. 하지만 DX10 / SM4 환경에서는 Geometry Shader를 사용해 이 정점들을 렌더링 시 동적으로 생성하는 것이 가능할 것이기에, 다시 각광 받게 될 지도 모른다.
Erik et al.[2]은 hierarchy를 이용해 이를 조금 더 효율적으로 그려내는 알고리즘을 제시하며, 다음과 같은 진전이 있다고 주장한다.
- 효율적인 계산
- silhouette edges에 대한 전처리가 필요 없다
- 텍스쳐 라이트나, 반투명 물체에 대한 그림자를 소화할 수 있다
Shadow Mapping
각 광원의 시점에서 깊이 값 렌더링을 하고, 이것을 Shadow Map이라 한다(Williams, 1978). 이후 원 시점에서 렌더링을 할 때 픽셀이 그려지는 곳의 실제 삼차원 위치와 광원의 위치와의 거리를 젠다. 만일 이 거리가 앞서 렌더링 해 놓은 거리와 동일할 때만 빛을 그린다.
이 방법의 장단점은 다음과 같다:
- 상호 투사 그림자를 표현할 수 있다는 장점이 있다.
- Self Shadow를 표현할 수 있다는 장점이 있다.
- 다각형에 붙여지는 텍스쳐의 내용을 고려한 그림자(앞서 이야기한 나뭇잎의 경우)를 표현할 수 있다는 장점이 있다.
- Soft Shadow가 용이하다는 장점이 있다.
- 그림자 외곽에 톱니 현상(aliasing)이 보인다는 단점이 있다. 이 문제는 광원과 그림자가 그려지는 표면의 거리가 멀 수록, 시점에서 가까울 수록, 그리고 Shadow Map이 저해상도일 수록 더 심해진다.
마지막에 제기된 톱니 현상을 해결하기 위해 많은 개량형이 나오고 있다. 개량형은 크게 Warped Shadow Maps와 Split Shadow Maps로 나눌 수 있다. 전자는 시점에서 가까운 부분을 더 높은 해상도로 그림자 맵을 만들기 위하여 특수한 변환 처리를 하는 방법이다.
- Perspective Shadow Maps (Stamminger and Drettakis, 2002)
- Light Space Perspective Shadow Maps (Wimmer et al., 2004)
- Trapezoid Shadow Maps (Martin and Tan, 2004)
Split Shadow Maps는 전경, 원경, 근경에 따라 (혹은 더 세밀한 거리에 따라) 여러 벌의 Shadow Map을 그리는 방법이며, 게임에서 더 많이 쓰이는 방법이다.
- Cascade Shadow Maps (Engel, 2006)
- Parallel-Split Shadow Maps (Zhang, 2006)
하지만 어떤 방법이든 극한의 특수 솽황에서는 표현력이 떨어질 수 밖에 없다.
Soft Shadow
경계가 부드러운 그림자를 구현하는 것에 있어서 그림자 맵에 Blurring을 주는 방법이 있다. 하지만 이 방법은 흐리게 처리된 그림자의 경계가 물체간의 삼차원적인 관계를 무시하고 흘러나와 버리는 문제가 있다. 이것을 보완하는 방법으로는 영상의 깊이 값을 보고 전후관계를 고려하며 그림자를 칠해나가는 방법이 있다. 비교적 시점 위치가 안정되어 있는 삼인칭 시점의 게임에는 상성이 잘 맞을 수 있겠다.
최근에는 조금 더 세련된 Variance Shadow Maps (VSM)을 사용하고 있다. 이는 그림자의 농도를 0 또는 1로 판별하는 대신 Chebyshev's Inequality에서 나오는 확률을 그대로 그림자의 농도로 사용하는 방법이다.간단하게 말하면 광원에서의 깊이 값과 깊이 값의 제곱을 적당히 지지고 볶아 Soft Shadow를 만들어 내는 방법이다. 이 기법의 단점은 그림자의 윤곽이 서로 겹치는 부분에 빛이 새어 들어오고 있는 것 같은 Light Bleeding 현상이 보인다는 것이다.
Ambient Occlusion
- Ambient Occlusion
- Ambient Occlusion Fields
- Screen Space Ambient Occlusion
- Screen Space Directional Occlusion (Ritchel, Grosch and Seidel 2009)
- SSAO와 거의 같은 방법을 쓰면서도 Directional Occlusion, Indirect Bounces를 다룰 수 있는 방법.
- 두 벌의 Render Target을 구워내는데, 하나는 Directional Occlusion을, 다른 하나는 Indirect Bounces를 다룬다. 기존의 SSAO는 이웃 픽셀들의 거리 정보를 사용, 차폐 정보의 적분값을 근사하여 원 조명에 튀겨주는 방법을 사용했다. 여기서는 Directional Occlusion을 위해서는 차폐 여부와 방향광값의 곱의 적분값을 사용하고, Indirect Bounces를 위해서는 차폐 된 부분에서의 조명도에 대해 방향을 고려한 광량의 적분값을 사용한다.
- 하지만 Screen Space에서의 표본은 시선을 향한 반구상에서만 하기 때문에 편향되어 있다. 이를 위해 Depth Peeling과 Additional Cameras 기법을 사용한다. Depth Peeling은 시선에서 가까운 복수의 깊이 값을 저장하여 차폐 정보 검사를 보다 정확하게 할 수 있도록 도와준다. Additional Cameras는 여기의 경우 카메라의 초점을 중심으로 각기 다른 방향으로 90도 회전시킨 네 개의 카메라를 사용하였다.
References
- Nishikawa, 3Dグラフィックス・マニアックス : 影の生成 (2008), 알로샤 번역
- Reeves, Salesin and Cook, Rendering Antialiased Shadows with Depth Maps (SIGGRAPH 1987)
- Donnelly and Lauritzen, Variance Shadow Maps (2006)
- Fernando, Percentage-Closer Soft Shadows (SIGGRAPH 2005) : PCF
- Stamminger and Drettakis, Perspective Shadow Maps (2002)
- Wimmer et al., Light Space Perspective Shadow Maps (2004)
- Williams, Casting Curved Shadows on Curved Surfaces (SIGGRAPH 1978) : Shadow Maps
- Martin and Tan, Anti-aliasing and Continuity with Trapezoidal Shadow Maps (2004)
- Zhang et al., Parallel-Split Shadow Maps for Large-Scale Virtual Environments (2006)
- Shishkovtsov, Deferred Shading in S.T.A.L.K.E.R. (2005), GPU Gems 2
- Crow, Shadow algorithms for computer graphics (1977)
- Isidoro, Shadow Mapping: GPU-based Tips and Techniques (2006)
- Engel, Cascaded Shadow Maps (2006), Shader X5
- Tran, Faceted Shadow Mapping for Large Dynamic Game Environments (2008), Shader X7
- Ritchel, Grosch, and Seidel, Approximating Dynamic Global Illumination in Image Space (2009), I3D 2009
- Pharr and Humphreys, Physically Based Rendering : From Theory to Implementation (2004), Morgan Kaufmann
- ↑ Wikipedia contributors, "Shadow volume," Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=Shadow_volume&oldid=460989329 (accessed December 25, 2011).
- ↑ Erik Sintorn, Ola Olsson, and Ulf Assarsson. 2011. An efficient alias-free shadow algorithm for opaque and transparent objects using per-triangle shadow volumes. In Proceedings of the 2011 SIGGRAPH Asia Conference (SA '11). ACM, New York, NY, USA, , Article 153 , 10 pages. DOI=10.1145/2024156.2024187 http://doi.acm.org/10.1145/2024156.2024187 PDF