쉐도우맵
실시간 그림자를 켜면 간단한 거지만 그림자를 렌더링 하는 것은 높은 성능을 요구 하기 때문에 성능 측면에서 보면 그리 간단한 문제만은 아니다.
유니티는 쉐도우맵
모든 굴곡에 대응하고 셀프-쉐도우(Self-Shadow)가 처리되는 등 높은 퀄리티를 보여주지만 문제는 역시 성능..
쉐도우맵은 그림자의 깊이를 저장하는 버퍼를 만든 후 픽셀쉐이더에서 깊이를 비교하는 과정을 거칩니다. 또한 넓은 영역을 커버하기 위해 여러 구역으로 나누기도 하고 계단 현상을 없애기 위해 여려번 샘플링하여 필터링 처리를 하는 등 부가 기능들이 추가 됩니다. 그러다 보니 그림자가 렌더링 비용 중 많은 부분을 차지하게 됩니다.
뎁스 텍스쳐(Depth Texture)
: 카메라를 통해서 렌더링 될 픽셀의 컬러 대신 카메라로 부터 픽셀의 우치까지의 거리를 렌더링한다.
"깊이를 보여주는 텍스쳐"
- 화면의 픽셀들이 카메라부터 얼마나 멀리떨어져있는지 알려주는 텍스쳐
- 가까이있을수록 검게, 멀리갈수록 하얗게 보이게 됩니다.
자..다음에 필요한건 광원에서 바라보는 오브젝트의 픽셀들의 깊이를 저장하는 버퍼...
광원에서 가까우면 흰색으로 멀어지면 검은색으로 표현되는 텍스쳐를 저장하는 버퍼..
그림자를 위한 정보를 담는 맵이라고 해서 "쉐도우맵" 이라고 한다.
이 뎁스텍스쳐와 쉐도우맵의 정보를 비교하여 그림자 영역을 계산한다.
- 추가적인 드로우콜 발생
- 픽셀쉐이더의 성능을 소모
이렇게 그림자 처리는 성능상 CPU와 GPU 모두에게 부담이 된다.
그래서 그림자 처리에 들어가는 드로우콜을 줄여주려면 반드시 그림자가 적용되어야 하는 오브젝트만 그람자를 활성화 하는 것이 중요 하다고 생각한다.
그림자의 해상도(그림자 품질) 문제를 해결하기 좋은 솔루션은 캐스케이드 쉐도우맵인데 그만큼 더 많은 드로우쿨을 요구하며 역시나 CPU와 GPU 모두에게 부담이 늘어나게 된다.
평면그림자
: 원형의 텍스쳐를 사용하는 평면을 만들고 그것을 캐릭터 밑에 까는것.. ㅋㅋㅋㅋ.. 쓸것도 없는데 참 원시적이다.
메시평면그림자
: 저렴한 성능 비용으로 버텍스 쉐이더를 이용해서 메시가 바닥에 평면으로 투영되도록 조작함으로써 그림자 처럼 보이게 만드는 방법. 이 방식은 쉐도우맵 처럼 픽셀쉐이더에서 비싼 연산을 거치지 않고 버텍스쉐이더에서 편육을 납작하게 만드는 방식으로 만드는 방법이고 참고로 셀프쉐도우는 처리가 안된다..
'Optimize' 카테고리의 다른 글
[Unity Optimize] 프로브(Probe) (0) | 2023.07.27 |
---|---|
[Unity Optimize] GI(Global Illumination)_01 (0) | 2023.07.27 |
[UNITY] 포워드 렌더링 / 디퍼드 렌더링 (0) | 2023.07.25 |
[Unity Optimize] 컬링(Culling) (0) | 2023.07.25 |
[Unity Optimize] 배칭(Batching) (0) | 2023.07.25 |