Optimize

[Unity Optimize] GI(Global Illumination)_01

구찬애 2023. 7. 27. 01:35
반응형

: 물체의 포면에 직접 들어오는 빛뿐만 아니라 다른 물체의 표면에서 반사되어 들어온 간접광까지 표현하는 방법

 

 - 실시간 라이팅에서는 GI를 처리하지 못한다

 

01. 라이트맵

: GI및 그림자 등을 포함한 라이팅 정보를 미리 연산(Precompute)하여 텍스쳐로 저장하는 프로세스

말 그대로 라이트를 담은 맵(텍스쳐) 이다.

왼쪽: 라이트맵이 적용된 씬. 오른쪽: 생성된 라이트맵 텍스처. 그림자 / 광원 정보가 모두 캡처

정적인 오브젝트 즉, Static 플래그가 체크된 오브젝트는 라이트맵으로 라이팅 결과를 미리 저장할수 있다.

그리고 Light Type을 Mixed나 Baked로 설정해야 한다

  • Static Object + Baked = Light map
  • 배경 오브젝트에 적용하기 좋은 솔루션

02. 실시간 GI (Realtime GI)

Realtime GI는 실시간 라이트의 GI를 처리하는 기능

실시간으로 런타임 동안 업데이트에 반영되어 Static 오브젝트만 적용되며 동적오브젝트에는 반영되지 않는다.여기까지만 읽어봐도 알수 있듯 런타임 동안 GI를 업데이트 한다는 것은 매우 큰 성능 소모를 요구 할수 밖에 없다.또 라이트의 밝기나 각도 범위 등이 변경 되어도 즉각적으로 반영되지 못하고 점진적으로 연산되면서 업데이트 된다.그 와중에 CPU의 사용량 정도는 조절이 가능하다. 모바일 디바이스는 감당하기 힘들다. 최신 하이엔드가 아니라면 ㅠ_ㅠ....

 

03. Progressive Lightmapper

고속 경로 추적 기반 라이트매퍼 시스템으로, Unity 에디터의 프로그레시브 업데이트를 통해 베이크된 라이트맵과 라이트 프로브를 제공합니다. 이 라이트매퍼 시스템은 영역이 작고 각도 오류가 없으며 겹치지 않는 UV와 차트 사이의 충분한 패딩을 필요로 합니다

 

유니티 매뉴얼 동영상

 

 

 

https://www.youtube.com/watch?v=foMZJrwRGr0 

 

 

04. 라이트맵의 해상도

지금 이 시간에도 많은 것들이 변하고 있을거고 많은 분들이 보다 나은 방법을 찾기 위해 노력하고 있겠죠.

하지만 우린 지금에 놓여 있습니다. 

우린 지금에 있죠..

그래서 우선은 라이트맵을 잘 쓸수 있는 방법들을 생각해 봅시다.

라이트맵의 해상도는 성능상 짚고 넘어가야 할 사항들이 있어 보입니다.

 

라이트맵은 여러장으로 나누면 그 만큼 배칭이 깨질 확율이 커집니다.

배칭의 원리가 같은 메터리얼이어야 하니까요.

이때 Lightmap Size와 Resolution을 조절하여 라이트맵을 1장에 나오게 한다면 드로우콜은 줄일수 있습니다. 

다만 Lightmap Size 가 너무 크면 대역폴 문제를 일으킬수 있으니 2048을 넘는 사이즈는 피하는 것이 좋습니다.

 

각 디바이스나 개발 환경이 다를수 있으니 타겟디바이스에 맞추어 사이즈나 해상도를 조절 하셔야 합니다.

 

05. Directional Mode

노말맵의 유무에 따라 Directional Mode와 Non-Directional Mode 선택하여야 한다.

Directional Mode : 노말맵을 적용하고 싶을 때 사용하지만 추가적이 리소스와 성능을 고려 해야 한다.

  • 추가적인 라이트맵을 생성한다(녹색)
  • 따라서 맵이 늘어나므로 추가적인 메모리와 추가적인 GPU성능이 필요하다.(노말/스펙큐러 연산)

Non-Directional Mode : 리이팅과 그림자 등이 기록된 라이트맵만 사용가능 하다.

  • 노말맵 / 스펙큘러 라이라이트은 처리되지 않는다. 단 리플렉션프루브는 적용된다.

06. Baked Indirect

Gi만 라이트맵에 기록하고 그림자는 기록하지 않고 런타임동안 실시간으로 연산한다.

 

07. Subtractive

GI와 직접 조명, 그림자까지 모두 라이트맵에 베이킹하는 모드

Static오브젝트에는 시시간라이팅이 이루어지지 않으며 스페큘러가 반영되지 않음

모두 라이트맵이 저장하므로 라이팅/그림자/AO까지 라이트맵으로 처리되며 런타임동안 라이팅 오버헤드가 극히 적어 저사양 모바일 디바이스에 사용하는 것이 적합니다.

08. ShadowMask

라이트맵을 구울때 그림자 영역을 별도의 텍스쳐로 따로 저장하여 모드

이 저장된 텍스쳐가 Shadowmask 이다

런타임동안 그림자가 캐스팅 연산자체를 수행하지 않고 마스크맵과 실시간 그림자와 자연스럽게 합성된다.

물론 스펙큘러라이트 연산이 적용 가능하지만 그로 인해 GPU 성능이 추가적으로 소모된다.

 

Baked Indirect와 다른점은 그림자 캐스팅연산에 대한 비용이 상태적을 절약된다는 것이다.

그림자 부분을 따로 마스크 텍스쳐로 가지고 있어 런타임동안 쉐도우맵을 이용한 연산을 수행하지 않고 다이나믹 오브젝트에 대해서만 쉐도우맵 연산을 함으로써 그림자 연산에 대한 비용을 절약할수 있는 것이다. 

이처럼 그림자 연산에 대한 성능비용을 대폭감소시킬수 있어 모바일 디바이스에서 사용하기 적합하다

 

Subtractive mode에서 퀄리티가 아쉽다면 Shadowmask도 고려해 볼수 있지만 성능비용이 좀더 요구 된다.

 

Shadowmask는 Distance Shadowmask모드로 확장될수 있다.

이 모드는 Static 오브젝트도 거리에 따라 쉐도우맵을 적용한다. 근거리는 쉐도우맵으로 실시간 그림자로 처리하고, 원거리는 Shadowmask로 그림자를 처리하는 방법이다.

 

 

 

 

 

 

 

 

 

친절하신 대마왕님.. 감사합니다.. 잘보겠습니다.

https://chulin28ho.tistory.com/443

 

유니티 신 버전 라이트맵 사용하기 3 ( Using Unity 2017 Lightmap - 3)

이제 라이트맵을 저장하는 법을 알았으니, 리얼타임 GI인지 뭔지를 해결해 봅시다. 그 전에, 라이트맵을 분류하는 법을 알아야 합니다. 라이트맵은 여러 종류가 있어서, 자신이 원하는 것을 사용

chulin28ho.tistory.com

8가지에 걸쳐 라이트맵을 정리 하셨습니다. 전 구차애니까.. 링크 드립니다. 홧팅.!

반응형