유니티 엔진 (Unity Engine)

유니티 그래픽스 최적화 - 6.그림자 (Shadow)

원소랑 2019. 9. 16. 15:13
728x90

.

.

6-1 쉐도우맵

Mesh Renderer 컴포넌트의 Cast Shadows 항목은 오브젝트의 그림자가 다른 오브젝트에 드리우는지,

Receive Shadows 항목은 오브젝트에 다른 오브젝트의 그림자를 받는지.

정적인 오브젝트는 라이트맵을 활용. 라이트맵은 GI(7)에서 다룸.

유니티는 쉐도우맵 기법을 사용. 그림자의 깊이를 저장하는 버퍼 생성, 픽셀쉐이더(Pixel Shader)에서 깊이를 비교하는 과정 거침. 넓은 영역은 여러 구역으로 나누기도 함(Cascade) 계단 현상을 없애기 위해 여러 번 샘플링, 필터링 처리 등. 렌더링 비용 중 많은 부분을 차지.

-----

셀프 쉐도우 (Self Shadow)

오브젝트 자기 자신의 그림자를 드리우는 기능.

-----

쉐도우맵의 원리 (포워드 렌더링 기준)

뎁스 텍스처 생성 (Depth Texture)

카메라로부터 픽셀의 위치까지의 거리(깊이)를 렌더링. 카메라에 가까울 수록 검은색. 멀수록 흰색.

그림자에 영향을 받는 모든 오브젝트들을 렌더링 해야 함. 프레임 디버거로 확인해보면 UpdateDepthTexture 라는 항목에서 처리.

그 후, 그림자 처리를 위한 별도 버퍼 필요. 광원에서 바라보는 오브젝트의 픽셀들의 깊이. 검은색은 광원에서 가깝고, 흰색이면 광원에서 멀다. 이 버퍼가 그림자를 위한 정보를 담는 맵. 쉐도우맵.

그림자 캐스팅 오브젝트들 렌더링. 프레임 디버거의 RenderShadowMap 항목에서 처리.

뎁스 텍스처, 쉐도우맵 완성.

정보를 비교하여 그림자 영역 계산. 뎁스 텍스처 픽셀 순회하면서 광원으로부터의 거리로 변환하여 비교.

쉐도우맵 저장된 거리보다 뎁스 텍스처 저장된 거리가 멀면 그림자를 드리워야 하는 픽셀로 판단. 화면에 보이는 공간을 기준으로 처리하고 쉐도우맵을 이용하여 그림자를 표현하기 때문에 스크린 스페이스(Screen Space) 쉐도우맵이라고 부름.

프레임 디버거의 CollectShadows 항목.

뎁스 텍스처와 쉐도우맵 렌더링 = 추가 드로우콜. 화면에 보이는 모든 픽셀에 대해 연산, 비교분기. 픽셀 쉐이더 성능 소모. CPU, GPU 모두 부담.

그림자가 적용되어야 하는 오브젝트만 활성화 시켜야 함. Mesh Renderer컴포넌트의 Cast Shadows 를 켜면 드로우콜 추가 발생. Shadows Only 를 활용하면 메시 자체가 그려지진 않음. 화면 렌더링은 고품질, 그림자 메시는 저품질 메시로 활용 가능.

Shadow Type. Soft Shadows 는 경계가 부드럽. 성능 필요. 그림자 경계 부드러게 만들기는 픽셀쉐이더 부담. 모바일 디바이스는 가급적 Hard Shadows 를 권장. Hard Shadows 는 해상도 차이 큼. Resolution 조정.

Edit > Project Settings > Quality 에서 Shadows 섹션. Shadow Distance 값 조절. 그림자 거리 조절 가능. 카메라로부터 그림자 그려지는 거리. 값이 낮으면 먼 그림자 안 그림. Shadow Resolution Low 여도, Shadow Distance 가 낮으면 그만큼 퀄리티가 높아진다.

일반적으로, Shadow Distance 는 가능한 낮게 잡고, 원거리는 라이트맵 활용.

먼 오브젝트 실시간 그림자 필요하면 캐스케이드 쉐도우맵(Cascaded Shadow Maps) 기법. Parallel Split Shdow Maps 라고 부르기도. 그림자 해상도 문제를 해결하기 위한 솔루션. 퀄리티 셋팅 > Shadows 섹션. Shadow Cascades. 2개 또는 4, 꺼줄 수도. 범위별로 여러 개를 만들어서 사용하는 기법. 원근법을 고려하여 프러스텀 영역을 몇 단계로 나눠서 서로 다른 쉐도우맵을 사용하도록 처리. 카메라에 먼 영역은 정밀도를 낮추고 가까운 곳은 정밀도를 높임. 근거리는 많은 해상도를 할당하기 위해 좁게, 원거리는 넓게 설정.

Scene 뷰의 좌상단, 드롭다운 Shadow Cascades 모드. 분할 및 비율, 쉐도우 거리 시각적 확인 가능. , 더 많은 드로우콜이 요구됨. 각 쉐도우맵 영역별로 따로 렌더링 되면서 그만큼 드로우콜이 늘어남. 픽셀 쉐이더 부담도 늘어남.

모바일은 기본적으로 Cascaded Shadows 기능이 비활성화. Graphics 셋팅에서 Use Defaults 를 끄고 플래그 켜주면 활성화.

6-2 평면 그림자

평평한 게임 배경 바닥의 평면 그림자.

01) 메시 평면 그림자

제약이 많은 구식 기법이지만 성능 저렴. 모바일에 적합.

버텍스 쉐이더를 이용해 바닥에 평면 투영되도록 조작.

커스텀 쉐이더 필요.

https://github.com/ozlael/PlannarShadowForUnity

그림자용 오브젝트 하나 더 생성. 머티리얼만 교체. 버텍스 쉐이더에서 연산. 광원의 방향 벡터와 버텍스가 지면과 수직하는 벡터를 가지고 연산, 평평한 지면에 맺히는 버텍스를 구할 수 있다. 그림자용 단순한 메시를 준비하는 것도 방법. LOD 모델을 활용하기도. 셀프 쉐도우는 기대할 수 없다.

.

.

728x90
반응형