160 likes | 506 Views
Shadow Mapping. Shadow Mapping 을 정리해보자 …. 작성 : 이창희 (cagetu79@gmail.com). 개요. 전통적인 shadow map Light 의 view point 에서 장면을 texture 에 rendering 한다 . Eye 의 view point 에서 장면을 랜더링한다 . 모든 물체들은 shadow map 안으로 투영되어 있다 . Depth>Depth(shadow) 라면 , 오브젝트는 그림자 안에 있다 . 문제점 : aliasing 문제.
E N D
Shadow Mapping Shadow Mapping을 정리해보자… 작성 : 이창희 (cagetu79@gmail.com)
개요 • 전통적인 shadow map • Light의 view point에서 장면을 texture에 rendering 한다. • Eye의 view point에서 장면을 랜더링한다. • 모든 물체들은 shadow map안으로 투영되어 있다. • Depth>Depth(shadow)라면, 오브젝트는 그림자 안에 있다. • 문제점: aliasing문제
Aliasing을 해결해보자 • Increase shadow map resolution • Unit cube clipping • Cascaded Shadow Maps (????) • Perspective Shadow Maps (Stamminger, 2002) • Light-Space PSMs (Wimmer, 2004) • Trapezoidal Shadow Maps (Martin, 2004) • Parallel-Split Shadow Maps • Variance Shadow Maps
Unit Cube Clipping • 화면에 보이는 객체들에만 shadow map으로 초점을 맞춘다. – 오직 보이는 receiver들만 shadow map 에 투영한다. • For large light sources / scenes, this may be a small percentage of the total scene • Shadow aliasing will depend on the viewer, but quality improvement can be substantial • Quality is always at least as good as not clipping
Unit Cube Clipping • 각 라이트에 대해, 보이는 오브젝트들은 라이트로부터 그림자가 드리워질지를 결정한다. • 이 오브젝트들에 의해 사용될 그림자 맵 영역을 최소화하는 light projection matrix를 구한다. • 변경되지 않은 lightProj에 의해 receiver들의 AABB를 변환한다. • 전체 bounding 영역으로 AABB들을 병합한다. • 전체 shadow map을 감싸기 위한 AABB 만들기 위해 bias & scale로 ortho 변환을 계산한다.(Compute ortho transform to bias & scale resulting AABB to cover the entire shadow map) • lightProj’ = ortho * lightProj;
Shadow Caster/Receiver • 알맞은 shadow map을 만들기 위해선, 적절하게 shadow caster와 receiver를 나누어서, shadow map을 만드는 영역을 최소화 해야 한다. • 일반 view frustum을 이용해서, 화면에 그려질 녀석과 아닌 녀석을 일차적으로 나눈다. • View frustum 내에 있는 객체의 경우에는, caster와 receiver가 모두 된다. • View frustum 외부에 있다면, 그림자가 화면 안으로 드리워지는지를 판별하여, caster로 구분한다. • 장면 그래프를 사용할 때에는, 상위 노드가 하위 노드의 컬링을 담당하게 되므로, 상위 노드가 하위 노드를 컬링하게 되더라도, caster/receiver를 산출하기 위해서는 추가적인 하위 노드(객체)들에 대해, 장면 순회를 적용해야 한다.
Perspective Shadow Maps • PSM은 표준적인 그림자 맵과 매우 비슷하나, 카메라에 가까운 영역들이 멀리 있는 영역보다 더 큰 해상도를 가지도록 왜곡된다는 점이 다르다. • 표준 그림자맵은 광원의 시점에서 장면을 랜더링한다. 하지만, PSM은 원근 이후 광원을 이용해서, 원근 이후 공간(Post-Perspective Space)에서 그림자맵을 만든다. 먼저, 장면과 광원을 원근 이후 공간으로 변환하고, 원근 이후 공간의 장면을 랜더링한다. • 원근 투영 이후의 view 공간으로 화면을 변환한다. • Light에 대한 투영 변환을 계산한다. • 원근 투영 이후의 공간 안에 라이트 위치로 부터 • 장면에 라이트 투영 변환을 적용한다. • 개념은 단순하지만, 실제로는 쉽지 않다. • 원근 투영 이후 공간은 문제점이 꽤 많다. • 가까운 오브젝트들에 대해 많은 shadow texel들을 소비한다.
Perspective Shadow Maps • 원근이후공간에서의광원 • 시선방향과수직인평행광원은원근이후공간에서xy 평면과평행을유지한다. • 관찰자를향한평행광원은원근이후공간에서무한평면상의점광원이된다. • 관찰자뒤에서장면을비추는평행광원의경우, 원래의평행광원이뿜어낸광선들은원근이후공간에서한점(소실점)으로수렴된다. 이는빛이무한평면상의한점에서장면으로도달한다는뜻이아니라무한평면에있는빛싱크(sink)에도달한다는뜻이다. • 원근이후광원의위치P일때, • Pw = 0 이면, 1의경우, • Pw > 0 이면, 2의경우, • Pw < 0 이면, 3의경우
Perspective Shadow Maps • 문제점 • PSM은 관찰자의 시야 절두체의 Near 평면이 너무 가까이 있지 않은 경우에만 좋은 결과를 나타냄 • 가까운 평면을 최대한 밀어낸다. Or • 시야 절두체를 확장한다. 관찰자를 가상으로 뒤로 옮기고 가까운 평면과 먼 평면을 그만큼 옮긴다. • 시야 절두체 전체를 그림자 맵이 덮는다면, 공간 낭비가 심하다. • 시야 절두체와 장면의 경계상자와의 교집합에 대한 그림자 맵을 생성한다면, 원근 이후 공간에서 광원이 비추는 빛 절두체를 최대한 맞추도록 한다.
Light Space Perspective Shadow Maps • 라이트 공간(light Space)에서 원근 투영 매핑을 사용한다. • 모든 라이트를 directional light처럼 취급하고, 라이트의 방향을 바꾸지 않는 것에 관련된 문제점이 원근 투영 매핑은 가지지 않는 이점이 있다. 따라서, PSM의 모든 문제점을 피할 수 있다. • Perpective mapping을 사용하기 때문에, PSM의 장점인 가까운 물체가 큰 해상도를 가진다. • 개요 • PSM은 view 변환에 의해 주어진 원근 투영 변화에 따라 shadow map을 감싸도록 하여 그림자의 질을 향상시킨다. • 원근 투영 변환들은 shadow map을 감싸기 위한 유효한 작업이지만, PSM에서처럼 view frustum과 연관될 필요가 없다. 사실 어떤 독단적인 원근 투영 변환이 사용되었다(?) • 원근 투영 변환의 주된 목적은 shadow map pixel들의 분포를 변화하는 것이기 때문에, shadow map 평면에 대부분 영향을 주도록 감싸져야 하고, shadow map과 이 축이 수직이면 안된다. • 위의 점들은 light space의 좌표축들에 관하여 명시된 원근 투영 변환을 만들어 낸다. 이 변환은 PSM과 대조적으로, view plane과 light vector가 평행하기 때문에, light source들의 방향이 변하기 않고, 이상 현상이 생기지 않는다(has no relevant singularities) . 이 결과 PSM에서 발견된 많은 문제점을 피할 수 있는 직관적인 변환을 만들 수 있다.
Light Space Perspective Shadow Maps • 그림자 계산에 적합한 Caster들의 적합한 Convex Body를 만든다. • Light space 에서의 원근 투영된 절두체(Perspective frustum)를 만든다. • Y축은 라이트 벡터 l에 의해 정의된다. (but pointing towards the light) • Point 라이트의 경우, spot direction 벡터가 light vector처럼 사용된다. • Spot 라이트들은 일반적으로 shadow map에서 사용되지 않는다. • Z축은 관찰자 view vector v 와 light vector를 포함한 평면에 놓이기 위해 light vectror에 수직이 되도록 정의한다. • X축은 직교 좌표 시스템 형태를 하기 위해서 다른 두 좌표로 보충한다. • xz 평면은 shodow-map 평면에 평행하고, Z축은 eye 좌표 시스템의 깊이 좌표에 거의 일치한다. • 왼손 라이트 공간 좌표계에서, Z축은 view Vector와 같이 동일한 방향을 가진다, 오른손 좌표계에서는 Z축은 반대로 만들어준다. • 원근 변환된 프러스텀 Pf에 대해서, near와 far 평면들은 xy-좌표 평면에 평행한 평면들로 정의되고, body B의 위치들 사이의 최소와 최대의 light-space z-좌표에 놓인다. • Pf에 대해 proection reference point p의 x, y 좌표는 결과 프러스텀이 거의 좌우 대칭이 되도록 조절해야 한다. x좌표는 변환된 viewpoint로부터, y좌표는 body의 최소와 최대의 y좌표의 중간값을 사용한다.
Light Space Perspective Shadow Maps • Construction of the perspective frustum P in 3D.
Light Space Perspective Shadow Maps • Choosing the free parameter n • Pf에 대해 남아있는 near 평면에서 projection reference p의 거리 n - free parameter 은 어떻게 shadow map을 정확하게 감쌀 것인지가 영향을 준다. • -만약 Pf의 near 평면을 선택한다면, 원근 왜곡이 심해질 것이다. 그리고, 그 효과는 오리지날 shadow map과 거의 유사하다. • -만약 Pf의 far 평면에서 너무 멀게 선택한다면, 원근 효과는 매우 낮아질 것이고, 이는 uniform shadow maps과 유사하게 나타난다. • 라이트 벡터에 수직인 뷰 방향의 경우, 이 파라미터에 대한 최적의 선택은 Zn과 Zf가 eye view frustum의 near, far 평면일 때, Nopt = Zn + Sqrt(Zf*Zn) 이다. • 또, viewr가 light 혹은 그 쪽으로 기울어져 있을 때, n은 증가하게 된다. 그래서, viewer가 light 쪽으로 정확하게 바라보게 되거나 그 쪽으로 기울어졌을 때 무한대에 도달하게 된다. 이 때, uniform shadow map과 동일한 결과를 나타나게 된다. • 결론적으로, frustum 평면들은 Pf의 near 평면 위에 body B의 모든 포인트들이 투영될 것이고, near 평면의 x, y축에 따라 최대와 최소 값들이 기록될 것이다. • 적용은 standard shadow map과 마찬가지로, light view projection matrix를 구하여, Target Texture에 랜더링하여 Shadow map을 생성하고, 이 변환 행렬에 Texture 매트릭스를 곱해서, shadow map을 랜더링하기 위해, 텍스쳐 좌표를 생성하여 적용한다.
적용?! • Key • Shadow map은 라이트 마다 한 번의 추가적은 랜더링 패스를 통해서, shadow map을 생성해낸다.
참고자료 • http://www-gs.informatik.tu-cottbus.de/~wwwgs/Shadow_Mapping.pdf • http://www.comp.nus.edu.sg/~tants/tsm.html • http://www.cg.tuwien.ac.at/research/vr/lispsm/ • http://hax.fi/asko/PSSM.html • http://developer.nvidia.com/object/variance-shadow-maps-gdc-2006.html