핵심 정리
1. 빛의 시점에서 scene depth를 shadow map에 렌더링
2. 카메라 렌더링 중 표면 위치를 light space로 변환
3. shadow map depth와 현재 depth를 비교
4. 더 뒤에 있으면 그림자| 개념 | 의미 |
|---|---|
| Shadow map | 빛에서 본 depth texture |
| Light space | 빛의 view-projection 기준 공간 |
| Bias | self-shadowing을 줄이는 depth 보정 |
| PCF | 여러 샘플을 평균해 경계를 부드럽게 함 |
| Cascade | 넓은 범위를 여러 shadow map으로 나눔 |
구조
그림자 매핑은 “빛이 볼 수 있는 표면만 밝다”는 관점으로 동작합니다. 먼저 빛의 시점에서 장면을 렌더링해 각 위치에서 가장 가까운 깊이를 저장합니다. 이후 카메라 렌더링에서 현재 fragment를 빛의 좌표로 변환하고, shadow map의 깊이보다 뒤에 있으면 빛을 받지 못한다고 판단합니다.
currentLightDepth > shadowMapDepth + bias
-> in shadowshadow map의 좌표 해석은 두 번의 변환을 거칩니다. world position을 light view-projection으로 보내고, 그 결과를 shadow texture의 UV와 depth 범위로 바꿔 비교합니다. 이 매핑이 흔들리면 그림자가 수영하듯 떨릴 수 있습니다.
Bias
shadow acne은 표면 자신이 자기 그림자를 만드는 현상입니다. depth precision과 rasterization 차이 때문에 현재 깊이가 shadow map 깊이보다 조금 뒤로 계산될 수 있습니다. bias는 이 차이를 보정하지만, 너무 크면 그림자가 물체에서 떨어져 보이는 peter panning이 생깁니다.
PCF는 shadow map을 한 번만 읽지 않고 주변 여러 texel을 읽어 평균을 냅니다. 경계는 부드러워지지만 샘플 수가 늘수록 texture fetch 비용도 늘어납니다.
directional light의 넓은 그림자는 한 장의 shadow map으로 품질을 유지하기 어렵습니다. cascade shadow map은 카메라 가까운 영역과 먼 영역을 나누어, 가까운 곳에 더 높은 해상도를 배정하는 방식입니다.
품질 기준
| 증상 | 의심할 원인 |
|---|---|
| 그림자 표면에 줄무늬 | bias 부족, depth precision |
| 그림자가 떠 보임 | bias 과도 |
| 그림자가 계단짐 | shadow map 해상도 부족 |
| 멀리서 품질 저하 | cascade 필요 |
| 가장자리가 딱딱함 | PCF, filtering |
| 움직일 때 떨림 | texel snapping, 안정화 필요 |
shadow map은 결국 texture입니다. 해상도, projection 범위, filtering, depth precision이 품질을 결정합니다.
주의할 점
shadow map 해상도를 무작정 올리면 메모리와 렌더링 비용이 커집니다. 품질은 해상도뿐 아니라 빛의 projection 범위를 얼마나 타이트하게 잡는지에 크게 좌우됩니다.
또 투명 물체, alpha cutout, normal bias, contact shadow는 기본 shadow mapping만으로 깔끔하게 처리되지 않을 수 있습니다.
참고 링크
1 sources