5. Shadow Map in Shadow Space On Rendering in Camera Space
Shadow Map applied
① ②
③
Shader Resource View
Sampling z-value from
Shadow Map
Compare z-value ① and ②
per pixel.
6. • 한 장의 Texture로 넓은 공간을 표현하기엔 해상도가 부족함.
• Texture 사이즈를 크게? -> 품질향상, But 성능 하락, GPU메모리
낭비
• PSM, TSM, LiPSM 등등 한 장의 Texture만을 사용하면서 최대한
낭비 없이 사용하는 기법들 등장
그냥 쓰기엔 약간 문제가…
7. • Shadow Map을 만들 때 한 장의 Texture가 아닌 여러 장의 Texture에
나눠 그리자.
• 뷰프러스텀 영역을 여러 개의 공간으로 잘라서 여러 장의 Shadow
Map Texture를 할당.
• 가까운 영역과 먼 영역에 따라 Shadow Map 정밀도 조절 가능.
• Shadow Map 해상도 증가에 따른 낭비가 적다.
Cascaded Shadow Maps
9. • Shadow Map으로 사용할 Texture 준비
• N개의 Cascaded 단계를 사용한다면 Texture 사이즈는 Width x N, Height
• Width x N인 이유는 한 장의 Texture에 N단계의 Shadow Map을 담기
위함이다.
• 루프를 돌며 0 ~ N-1단계까지 Shadow Caster를 렌더링.
• 뷰포트 설정을 바꿔가며 한 장의 Texture에 모두 담는다.
• Shadow Receiver를 렌더링할때 픽셀이 어느 Cascaded단계에
들어가는지 찾아서 tex좌표의 u성분 offset조정
• 이후는 일반적인 Shadow Map과 똑같음.
구현
10. • Cascaded단계에 따라 Draw Call회수가 늘어남. CPU 자원 낭비.
• 코드 복잡해짐.
• 한방에 모든 Cascaded 단계를 처리할 수 없을까?
개선하고 싶은 점
11. • 말 그대로 Texture배열
• 배열이지만 단일 Texture처럼 다룰 수 있다.
• SRV, RTV로 사용 가능.
• CPU측 코드에서 API사용 방법은 일반 Texture와 똑같다.
• Texture로부터 샘플링시 좌표의 x,y,z성분중 z성분을 배열의
인덱스로 사용
Texture Array
14. • N개의 Cascaded단계가 있을 때 사이즈 Width , Height에 배열이
N개인 Texture 생성
• 일반 Texture와 마찬가지로 RTV와 SRV생성
• Shader안에서 어느 Cascaded 단계에 포함되는지 계산하고 그
인덱스 값을 텍스쳐 좌표의 z성분으로 사용
Texture Arrary를 Shadow Maps에 적용
21. • Draw Call을 대폭 줄일 수 있다. CPU측 병목을 줄임
• 코드가 보다 간결해짐.
Texture Array사용의 장점
22. • 각각의 Light View Space 프러스텀에 대한 culling
• 프러스텀에 대한 culling을 먼저 수행한 후 Constant Buffer를 통해 bit
flags로 전달.
• Geometry Shader에서 0,1,2,3… 각 비트를 체크하며 0 – N까지의
Cascaded단계에 포함되는지를 검사. 비트가 0이면 그대로 폐기.
• GPU상에서 클리핑이 이루어지므로 CPU측에서 별도의 Culling작업에
필요한 시간을 감안하면 굳이 필요가 없을지도????
추가적인 최적화