Skip to content

Implement Shadow-specific Frustum Culling for Directional Light #598

@redcamel

Description

@redcamel

1. Overview

현재 렌더링 시스템은 **메인 카메라의 프러스텀(Main Camera Frustum)**을 기준으로 오브젝트를 컬링합니다. 그러나 **디렉셔널 섀도우(Directional Shadow)**의 경우, 카메라 시야 밖에 있는 물체라도 시야 안으로 그림자를 드리울 수 있습니다. 기존 방식(Main Camera Culling)을 유지할 경우 그림자가 비정상적으로 사라지거나 끊기는 현상이 발생하므로, 이를 해결하기 위해 라이트 공간(Light Space) 기준의 컬링 로직을 도입하고자 합니다.

2. 문제점 (Current Issues)

  • Shadow Pop-off: 섀도우 캐스터(물체)가 메인 카메라 시야 밖으로 나가는 순간, 해당 물체가 드리우던 그림자가 화면 내에서 즉시 사라지는 현상.
  • Performance Waste: 시야와 전혀 상관없는 영역의 물체까지 그림자 맵(Shadow Map)에 그려질 경우 불필요한 GPU 오버헤드 및 드로우콜(Draw Call) 발생.

3. 해결 방안 (Technical Details)

A. Light Space Orthographic Frustum Culling

  • 디렉셔널 라이트의 섀도우 맵 생성을 위해 설정된 Orthographic Projection MatrixLight View Matrix를 결합하여 새로운 Shadow Frustum을 추출합니다.
  • 그림자 패스(Shadow Pass) 렌더링 시, 메인 카메라 프러스텀 대신 이 Shadow Frustum을 기준으로 오브젝트를 컬링하여 그림자가 잘리는 문제를 방지합니다.

B. Shadow Caster Volume (Extended Frustum)

  • 더 정밀한 최적화를 위해, 메인 카메라의 프러스텀 바운더리를 빛의 역방향(Light Direction)으로 확장한 Shadow Caster Volume을 계산합니다.
  • 카메라 시야 안에 그림자를 드리울 가능성이 있는 물체(Potential Casters)만 선별하여 섀도우 맵 렌더링에 포함시킴으로써 렌더링 효율을 극대화합니다.

4. 작업 계획 (To-do List)

  • ShadowManager 내부에 라이트 전용 프러스텀(Shadow Frustum) 계산 로직 추가.
  • Renderer.ts 및 렌더링 파이프라인에서 renderShadowLayer 호출 시 메인 카메라와 분리된 별도의 컬링 데이터 전달.
  • 거리에 따른 작은 물체 섀도우 드로우콜 제외(Shadow LOD) 로직 검토.

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions