Notice
Recent Posts
Recent Comments
Link
반응형
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

RenderLog

Dual Paraboloid ShadowMap 본문

Graphics/Graphics

Dual Paraboloid ShadowMap

scahp 2020. 2. 18. 23:47

Dual Paraboloid ShadowMap

 

최초작성 : 2020 2 17

최종수정 : 2020 2 17

최재호

목표

Dual-Paraboloid Map 소개

 

소개

Environment or Shadow map을 생성하기 위해 사용할 수 있는 알고리즘

2개의 Paraboloid(포물면) 을 이어 붙인 형태로 아래의 공식을 사용하여 생성

위와 같은 형태의 Paraboloid 선택. (편미분하게 되면, x or y 로 딱 떨어져서 1/2를 사용하는 것 같음)

Math3D.org 에서 렌더링한 Dual Paraboloid

 

Paraboloid의 특징으로 아래와 같이 Focal Point 방향의 입사광선은 Paraboloid와 평행한 방향으로 반사된다는 것

위의 그림처럼 입사광선(In)이 있을경우 반사광산(Rn) (0, 0, 1)로 하여 더해주면 Paraboloid 위에서의 Normal 방향의 Vector를 얻을 수 있다. (반사광선을 (0, 0, 1)로 간단히 계산할 수 있는 이유는 World * View Matrix를 곱한 후에는 카메라위치가 원점에 위치하게 되기 때문)

 

아래와 같이 Paraboloid 공식을 X, Y방향에 대해서 편미분하여 X, Y CrossProduct를 통해 Normal Vector를 구할 수 있다. Normal Vector의 특성을 보면, Paraboloid 위의 점 P X, Y 좌표가 점 P에서의 Normal Vector X, Y와 동일함을 알 수 있다. , 위에서 얻은 Normal 방향의 Vector In + Rn = Np 에서 Np Z-Component X, Y를 나눠주면, P에서의 Normal Vector와 일치하게 된다. 우리는 이 Normal Vector X, Y Paraboloid에서의 X, Y 위치라는 것을 알고 있다. 이제 이 X, Y를 텍스쳐 좌표와 NDC 좌표로 사용한다.

장점

  • View-Independent
    • Spherical Map View-Dependent
    • Spherical Map에 비해서 앞과 뒤 2개의 맵을 사용하므로 더 나은 퀄리티를 제공함
  • Praboloid 로의 투영이 쉬움
    • Paraboloid의 중점(Focal Position) 입사광선에 의해 반사되는 벡터가 Paraboloid 방향과 평행한 특성때문에 Praboloid로의 투영이 쉽다는 장점
  • Cubical Map은 총 6개의 Map을 렌더링해야하는 반면 2개 면만 렌더링하면 되므로 성능은 더 좋음

 

단점

  • Dual-Paraboloid 가 마주하는 Clipping Plane Crack이 발생됨
    • 클리핑 평면과 Geometry가 교차하지 않게 최대한 노력해야함
    • Cubical Map의 경우도 발생하나 Dual-Paraboloid 가 더 심하게 나타남

아래 코드는 Dual-Paraboloid ShadowMap 생성 코드입니다.

512 x 1024 의 텍스쳐에 Dual-Paraboloid ShadowMap 2개를 모두 렌더링 하였습니다.

2Pass 로 처리하였기 때문에 Geometry Shader를 사용하여 앞/뒤 Paraboloid의 Vertex를 생성해주었습니다.

Vertex Shader
Geometry Shader
Fragment Shader

 

실제 구현

  • Dual-Paraboloid 2개의 면을 렌더링해야 하므로 Geometry shader를 사용하여 2면을 동시에 그림
  • 텍스쳐를 각각 나눠서 사용하지 않고 1장에 앞면과 뒷면을 동시에 그림 (ex. 512x1024)

 

포인트 라이트에 사용할 Dual Paraboloid ShadowMap 생성 후 적용 (좌측 하단에 앞/ Paraboloid 표시)

 

Dual-Paraboloid Clipping Plane에 걸린 경우 아래와 같은 문제가 발생 가능

(Geometry 10배 더 정교하게 만들어도 Cone 의 경우는 완화 되지 않았음…)

 

이 문제는 Clipping Plane Geometry를 최대한 피하도록 아래와 같이 Paraboloid가 위아래를 보도록하여 완화

(하지만 좁은 방안과 같이 닫힌 공간에서는 가로라인으로 크랙이 보일 수 있음)

 

예제 코드

https://github.com/scahp/Shadows/tree/DualParaboloidShadowMap

반응형

'Graphics > Graphics' 카테고리의 다른 글

Light Indexed Deferred Rendering  (0) 2020.04.03
Tangent Space, Tanget Vector 생성  (0) 2020.03.28
DeepShadowMap(DSM)  (0) 2020.02.25
DeferredRenderingMSAA  (0) 2020.02.12
Hi-Z Occlusion Culling  (3) 2020.02.04