| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- GPU
- DX12
- optimization
- SGPR
- shader
- RayTracing
- unrealengine
- Graphics
- texture
- DirectX12
- forward
- scalar
- SIMD
- UE5
- vulkan
- wave
- Study
- ShadowMap
- Nanite
- GPU Driven Rendering
- Wavefront
- ue4
- hzb
- atmospheric
- scattering
- VGPR
- deferred
- 번역
- Shadow
- rendering
- Today
- Total
RenderLog
Dual Paraboloid ShadowMap 본문
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를 생성해주었습니다.



실제 구현
- 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 |