Untitled

그림자를 구현하기 위해 Shadow Mapping 기법을 사용했습니다. 점 광원, 방향성 광원, 스포트라이트와 같이 다양한 형태의 광원을 모두 사용하기 위함이었고, 실시간 렌더링이 필요한 게임이라는 프로그램 특성 또한 고려하였습니다.

Shadow Map 생성

Untitled

  1. 뷰 행렬과 투영 행렬 설정

    xmmtxProjection = DirectX::XMMatrixOrthographicLH(fWidth, fHeight, fNearPlaneDistance, fFarPlaneDistance); //directional light의 경우

    xmmtxProjection = DirectX::XMMatrixPerspectiveFovLH(XMConvertToRadians(fFovAngle), fAspectRatio, fNearPlaneDistance, fFarPlaneDistance);//spot light의 경우

    Untitled

    1. 씬 렌더링

위의 코드에서 Render() 함수는 주어진 뷰 행렬과 투영 행렬을 사용하여 씬을 렌더링하고, 이를 통해 Depth Map을 생성합니다. 이 Depth Map은 그림자를 계산할 때 사용됩니다.

Shadow Map 사용

Untitled

  1. 이 함수에서는 먼저 입력으로 받은 버텍스의 위치를 월드 좌표계로 변환합니다.

  2. 뷰 행렬과 투영 행렬을 적용하여 화면 좌표계로 변환합니다.

  3. 각 빛에 대해 버텍스의 위치를 빛의 관점으로 변환합니다.

    : gcbToLightSpace[i].mtxToTexture 행렬을 적용하여 수행되며, 이 행렬은 빛의 뷰 행렬과 투영 행렬을 결합한 것입니다.

  4. 변환된 위치는 output.uvs[i]에 저장되며, 이 값은 후처리 단계에서 Shadow Map과 비교됩니다.

Untitled