7. Shadow Mapping
오늘날의 그림자 매핑은 2단계를 거쳐 렌더링한다.
6
Rendering
Shadow Map
Rendering
Scene
깊이 버퍼 그림자 매핑 https://www.slideshare.net/SukwooLee4/20181222-126893802
8. Shadow Map
그림자 맵은 깊이 버퍼를 이용해서 생성한다. (깊이 버퍼 그림자 버퍼)
이때 한 점의 광원 위치로부터 가장 가까운 객체 표면의 거리를 깊이 버퍼에 저장한다.
7
A
B
C
D
0.0
0.5
0.7
0.85
1.0
깊이 버퍼 그림자 매핑 https://www.slideshare.net/SukwooLee4/20181222-126893802
9. Perspective Projection
Light Space의 위치를 원근 투영하여 그림자 맵에 저장한다.
8
Perspective Projection
0.0
1.0
Spotlight Shadow, Point Light Shadow에 적용 가능
한 점의 광원에서 빛이 전방위로 방사한다고 가정
23. Shadow Map Aliasing Problem
구현에 앞서 고려해야할 사항이 있다.
바로 쉐도우 맵을 사용할 경우 반드시 발생하는 엘리어싱 문제이다.
22
24. Shadow Map Aliasing Problem
장면이 렌더링 되는 백버퍼는 카메라를 기준으로 3차원 데이터를 투영한다.
반면 쉐도우 맵은 빛을 기준으로 투영하기 때문에 이에 따른 엘리어싱 문제가 발생한다.
23
Back Buffer
Shadow Map
25. Shadow Map Aliasing Problem
따라서 엘리어싱을 고려하여 쉐도우 맵을 분할해야 한다.
24
𝑑𝑝
𝑑𝑠
=
1
𝑡𝑎𝑛∅
×
𝑑𝑧
𝑧𝑑𝑠
×
𝑐𝑜𝑠∅
𝑐𝑜𝑠𝜃
Projective
Aliasing
Perspective
Aliasing
26. Practical Split Scheme
아래 그림은 카메라 프러스텀의 분할 방법을 보여준다.
그림 (a) 는 단순히 균등하게 나눈다. 그러나 이 방식은 카메라 가까운 프러스텀에 대한
쉐도우 맵이 엘리어싱 문제가 상대적으로 두드러져 퀄리티가 떨어진다.
25
27. Practical Split Scheme
그림 (b)는 로그 함수를 이용하여 분할한다.
로그 분할의 경우 가까운 프러스텀에 대한 쉐도우 맵의 퀄리티가 좋아지지만 멀리있는
프러스텀의 쉐도우 맵 퀄리티가 너무 떨어질 수 있다.
26
32. Light View Transformation
월드 공간의 위치를 (광원 기준) 시야 공간으로 변환
31
한가지 특이한 점은 World Center를 기준으로 뷰 매트릭스를 생성하였다.
이렇게 하는 이유는 Directional Light의 위치를 특정하기 어렵기 때문이다.
33. Light View Transformation
월드 공간의 위치를 (광원 기준) 시야 공간으로 변환
32
Eye position
World Center
Directional light vector
Look at
47. Geometry Shader
46
지오메트리 쉐이더 코드를 보면 하나의 삼각형에 대한 3개의 버텍스를 모든 쉐도우 맵에 출력
한다.
이는 해당 쉐도우 맵 위치에 없는 것도 출력한다는 것을 의미한다.
물론 하드웨어가 알아서 클리핑해주긴 하지만 굉장히 비효율적으로 보인다.
직접 코드를 작성하여 컬링할 수도 있는데 왜 이렇게 처리하는 것일까?
그 이유는 컬링 계산에 대한 비용이 만만치 않기 때문이다.
여기선 하드웨어가 클리핑하도록 냅두고 있지만 시간 남아도는 사람만 컬링 테스트 해보도록
하자.
55. CSM in UE4
Scene에 Directional light를 추가한 후 레벨에서 선택하면 디테일 탭에서 CSM을 설정할 수 있다.
54
56. CSM in UE4
Dynamic Shadow Distance StationaryLight
55
카메라 위치를 기준으로 CSM의 범위를 설정한다.
(0이면 off, 그 외 값이면 on )
Shadow Map
Scene
Dynamic Shadow Distance
57. CSM in UE4
사용할 쉐도우맵 개수 설정
56
CSM을 몇 개로 쪼갤지 정한다.
1
2
3
58. 참고자료
HLSL 프로그래밍 – 중첩된 셰도우 맵
소스 코드 : http://www.acornpub.co.kr/book/hlsl-cookbook
GPU Gem3 Chapter 10. Parallel-Split Shadow Maps on Programmable GPUs :
https://developer.nvidia.com/gpugems/gpugems3/part-ii-light-and-shadows/chapter-10-
parallel-split-shadow-maps-programmable-gpus
언리얼 엔진 가이드 CSM :
https://docs.unrealengine.com/ko/Resources/ContentExamples/DynamicSceneShadows/index.html
57