GAME GRAPHIC GUIDE/Unity

유니티 라이트맵 설정 & 최적화 / Unity Optimization

레임3D 2019. 9. 18.

드로우콜

- CPU 가 GPU에게 오브젝트를 그리라는 명령을 호출하는 것  
- 메쉬 / 텍스쳐 / 쉐이더 / 트랜스폼 / 알파 여부 등의 정보 
- 기본적으로 메쉬가 여러개인 경우 증가  
머티리얼이 여러개인 경우도 증가  
- 쉐이더 중 아웃라인 쉐이더는 두번 렌더링하기 때문에 드로우콜은 2가 됩니다.

 

Batch

- DP Call 과 상태변경을 포함하는 넓은 의미의 드로우콜을 의미합니다.

- 정적 배칭에는 메모리와 스토리지가 많이 사용되고,

  동적 배칭에는 CPU 리소스가 좀 많이 사용됩니다.

 

- 동적 배칭 : 메쉬가 충분히 작은 경우에 사용하면 버텍스가 CPU에서 트랜스폼되고

                 여러 유사한 메쉬가 그룹화되고, 모든 것이 한꺼번에 드로우됩니다.

   1) 동적 배칭은 리소스 사용량이 버텍스마다 일정하므로,

      900개 미만의 버텍스 속성과 300개 미만의 버텍스가 포함된 메쉬에만 적용됩니다.

   2) 쉐이더가 버텍스 포지션, 노멀 및 싱글 UV를 사용하는 경우 버텍스를 300개까지 배칭할 수 있고,

      셰이더가 버텍스 포지션, 노멀, UV0, UV1 및 탄젠트를 사용하는 경우 180까지만 배칭할 수 있습니다.

   3) 머티리얼이 다른 경우 배칭되지 않음

 

- 정적 배칭 : 움직이지 않는 게임 오브젝트를 큰 메쉬로 합치고 더 빠른 방법으로 렌더링합니다.

정적 배칭 Static

   1) 메쉬를 저장할 메모리가 필요

   2) 때로는 메모리 사용량을 적게 유지하기 위해서

      정적 배칭을 방지하여 렌더링 성능 저하를 감수하기도 합니다.

      예를 들어 밀집한 숲 레벨에서 나무를 정적으로 효시하면 메모리에 중대한 영향을 미칠 수 있습니다.

   3) 메쉬 렌더러, 트레일 렌더러, 라인 렌더러, 파티클 시스템 및 스프라이트 렌더러만 배칭됩니다.

   4) 스킨드 메쉬, 천 및 기타 렌더링 컴포넌트 타입은 배칭되지 않습니다.

   

SetPass

- 상태 변경(쉐이더로 인한 렌더링 패스 횟수)  
- CPU 성능 소모

- 서로 다른 메쉬라도 동일한 머티리얼을 사용하면 SetPass는 1이다. (Batch는 메쉬의 수만큼 증가)

 

Batching

- 여러개의 배치를 하나로 묶어서 하나의 배치로 만드는 것. (드로우콜을 하나로 묶는 과정)  
- 가능한 한 많은 게임 오브젝트가 머티리얼을 공유하는게 좋습니다.

- 메쉬가 다른데 머티리얼을 공유하면 1개의 드로우콜로 표현하는 것이 가능.

 

Static Batching

- 런타임(게임중)동안 움직이지 않는 오브젝트를 스태틱으로 설정.

- 런타임 성능 향상 vs 스태틱 설정시 메모리가 추가로 필요해서 어느 설정이 괜찮을지는 테스트가 필요합니다.

- 스태틱 설정으로 배경의 모듈화 방식이 가능하며 성능면에서 효율적입니다.

- Static Batching : Edit - Project Settings - player

 

아틀라싱

텍스쳐만 다른 동일한 머티리얼이 2개 있는 경우,

이 텍스쳐를 합쳐서 큰 텍스쳐로 만드는 과정을 아틀라싱이라고 합니다.

 

텍스쳐가 같은 아틀라스 안에 있으면 머티리얼 하나를 대신 사용할 수 있습니다.

 

[어려움]

섀도우 캐스터는 머티리얼이 다른 경우에도 종종 렌더링 중에 배칭할 수 있습니다.

Unity의 섀도우 캐스터는 섀도우 패스에 필요한 머티리얼의 값이 동일한 경우 다른 머티리얼에도

동적 배칭을 사용 할 수 있습니다.

 

예를들어 많은 크레이트에 텍스쳐가 다양한 머티리얼을 사용할 수 있지만,

섀도우 캐스터에는 렌더링이 중요하지 않으므로 이 경우에는 함께 배칭할 수 있습니다.

 

오쿨루전 컬링

- Window > Rendering > Occlussion Culling : Bake 하면 적용  
- 스태틱에는 오클루더(Occluder), 오클루디(Occludee)가 있음

- 오클루디 : 다른 오브젝트에 의해서 가려지는 물체

- 오클루더 : 다른 오브젝트를 가리는 물체

- 일반적으로 Static 을 체크하면 둘다 체크됩니다.

 

렌더링

- 포워드 렌더링 : 모바일

- 디퍼드 렌더링 : PC 기반. 동적 라이트를 비교적 좋은 성능으로 처리해줍니다.
                    실시간 라이팅을 렌더하는 과정으로 최종 완성의 타이밍이 지연되기 때문에

                    Deferred(지연된)라는 이름이 붙었다네요.

 

유니티 라이트 3가지 모드

- Realtime : 실시간 라이팅 연산. 성능에 가장 큰 영향을 주기 때문에 라이트맵 설정시 제외

- Baked :  미리 연산되어 저장된 라이트. 런타임상에서 동적으로 움직이는 물체에는 적용할 수 없다는 뜻.  
- Mixed : Baked와 Realtime 모드 혼합. 라이트맵 사용 +  동적인 캐릭터에도 라이트를 적용하고 싶을때.

 

Render Mode

- Important : 해당 라이트가 중요하다고 설정합니다.

                  픽셀당 연산하기 때문에 스펙큘러, 노멀맵 대응이 가능하다는 것을 의미합니다.
- Not Important : 버텍스 당 처리. Important보다 품질이 떨어지지만 성능 부담이 적습니다.

- 라이트 1개를 Important로 설정하고 나머지를 Not Important로 설정하면 한번의 드로우콜로 처리  
- 일반적으로 모바일은 *Pixel Light Count를 0이나 1로 설정합니다. 씬에서는 라이트맵과 라이트 프로브 활용

   (Edit - Project Settings - Quality 로 창을 열고 Rendering에 있음)


 

라이트맵 기본 설정

▶ 실시간 조명 Mixed 설정 후 Off

  실시간 조명으로 사용되는 디렉셔널 라이트는 기본적으로

  Realtime Mode로 되있는데 라이트맵에 영향을 주지 않습니다.

 

  실시간 조명을 복사해서 라이트맵 베이크용 조명으로 이름을 지정해주고

  프로젝트의 상황에 따라 다르지만 보통 실시간 조명(캐릭터 그림자)와 라이트맵 그림자를

  같이 사용하는 경우가 많기 때문에 실시간 조명을 Mixed로 설정합니다.

마지막 부분에 Culling Mask는 실시간 조명을 받을 대상들의 레이어만 체크해줍니다.

레이어는 오브젝트 마다 미리 지정되있어야 겠죠?

이제 라이트맵을 베이크하는 동안에는 실시간 조명은 필요없으니 꺼두시면 됩니다.

 

▶ 라이트맵 베이크용 조명 설정

 라이트맵 조명은 모드를 Baked로 설정하고

 Culling Mask는 라이트맵을 베이크할때 적용될 오브젝트 레이어를 지정해줍니다.

 위에 언급했던것 처럼 레이어는 오브젝트들에 미리 적용 되있어야 합니다.

▶ 라이트맵 채널 생성

  메쉬(FBX)의 Model - Generate Lightmap UVs 체크해주세요.

  라이트맵 베이크에 필요한 UV 채널이 자동으로 생성됩니다.

  3DMax 에서 직접 UV 2번 채널을 만들어 가져와도 됩니다.

▶ 스태틱(Static) 설정

이제 Scene에 배치된 오브젝트는 Inspector 우측 상단의 Static에서 Lightmap Static을 체크

▶ 스케일 확인하기

오브젝트의 Mesh Renderer - Lightmap Static 체크하고 Scale In Lightmap 값을 확인합니다.

기본값은 1이지만 중요하지 않은, 작은 오브젝트는 수치를 낮춰주는게 좋습니다.

 

Lighting 옵션 설정

주로 아래 체크된 부분만 확인해주면 됩니다.

▶ Lighting Mode는 3가지 있습니다.

1) Baked Indirect 

   Static 처리된 건물의 그림자와 캐릭터의 그림자가 실시간으로 처리됩니다.

   그림자가 중요하면 사용하세요. AO등의 GI는 반영되고, 디렉셔널 라이트 그림자는 처리되지 않습니다.

   가벼운 모바일 게임을 제작할때는 사용하지 않는게 좋습니다.

 

2) Subtractive 

   전통적인 라이트맵 방식으로 저사양 모바일에 적합합니다.

   GI, 직접조명, 그림자까지 라이트맵에 베이킹.

   Static 오브젝트는 실시간 그림자 생기지 않고 라이트맵으로 처리되며, 스펙큘러는 반영되지 않습니다.

   라이트맵 그림자와 캐릭터의 그림자(실시간)의 농도가 다르게 나오는 단점이 있습니다.

   실시간 그림자의 컬러 조정은 가능하기 때문에 조금이나마 비슷하게 그림자 농도를 맞춰주는게 좋습니다.

 

3) Shadowmask 

   그림자 영역을 별도의 텍스쳐로 따로 저장합니다.

   실시간 캐릭터 그림자와 자연스럽게 합성되고, 스펙큘러 하이라이트가 적용되는게 Subtractive와 다릅니다.

   Baked Indirect보다 가벼워요. Subtractive 보다는 스펙큘러를 표현을 해야되서 GPU 성능이 추가로 소모되구요.

 

추가로 Edit - Project Settings - Quality에 있는 Shadow탭 옵션에서

Shadowmask Mode : Distance Shadowmask 로 설정하면

근거리 Static 오브젝트는 실시간 그림자, 원거리는 Shadowmask로 그림자 처리됩니다.

즉 근거리일때 오브젝트 그림자가 캐릭터에 그려집니다.

 

▶ Lightmapper - Progressive : 라이트맵 베이크 과정을 확인 가능합니다.

                                     유니티 버전에 따라 모드가 조금씩 다릅니다.

 

▶ Lightmap Resolution : 라이트맵 픽셀(텍셀)의 밀도.

    낮을 수록 라이트맵 크기가 가벼워지나 그림자 퀄리티가 떨어지게 됩니다.

    텍스쳐 사이즈를 지정한 후에 이 수치를 낮춰가면서 원하는 텍스쳐 장 수와 퀄리티를 맞춰주게 됩니다.

 

▶ Lightmap Size : 라이트맵 텍스쳐 최대 크기, 최대 크기를 초과하면 라이트맵이 한장씩 추가됩니다.

    라이트맵이 여러 장으로 나뉘면 배칭이 깨질 확률이 높아집니다.

    라이트맵이 나뉜다는 것 자체가 머티리얼과 텍스쳐가 분리된다는 뜻이기 때문이죠.
    라이트맵 사이즈가 너무 크면 대역폭 문제를 일으킬 수 있습니다.

 

Directional Mode : 노멀맵을 적용하려면 Directional.

   Non-Directional은 노멀맵, 스펙큘러 하이라이트를 표현하지 않습니다. 리플렉션 프로브는 적용되요.

 

라이트 프로브

- 라이트맵은 표면에 맺히는 라이팅 정보를 저장하고, 라이트 프로브는 라이팅이 지나는 공간의 지점을 저장.

- 라이트프로브는 주변 빛의 값들을 미리 연산해서 가지고 있다가 런타임에서 표현하기 때문에

   실시간 라이팅보다 가볍습니다.

- Component > Rendering > Light Probe Group로 생성하거나

- 하이어라키에서 Creat > Light > Light Probe Group로 생성할 수 있습니다.

- 생성 후 Edit Light Probes 버튼 누르면 추가/편집 가능합니다. 

- 건물 주변은 그림자 영역 변화가 크니 라이트프로브를 더 많이 설치해주고,

  그림자 변화가 적은 곳은 넓은 공간(광장)은 조금만 설치해줘도 됩니다.
- 스펙큘러 라이팅은 표현 못합니다.

 

리플렉션 프로브

- Create > Light > Reflection Probe

- Box Size를 조절해서 영역 설정.  
- 리플렉션 프로브 영역안에 영역이 더 작은 새로운 리플렉션 프로브를 추가할 수 도 있습니다.
- 이미지가 큐브맵이기 때문에 리플렉션 프로브 컴포넌트의

   Cubemap capture settings - Resolution 해상도를 바꿔줄 필요가 있습니다.
- 해상도가 128이라는 것은 큐브맵 한장의 사이즈가 128 이다.(총 6장이기 때문에 x6) 

 


 

Etc. 기타

쉐이더에서 불투명은 반드시 Rendering Mode를 Opaque로 설정해야합니다.

Transparent로 설정되있으면 불투명이라도 실제로는 투명 오브젝트로 취급되거든요.

알파 컷아웃은 알파 영역 끝이 분명한 경우이고

블렌드 알파는 알파 영역 끝이 자연스럽게 흐려짐

알파테스트는 성능 저하를 일으키니 알파 블렌딩으로 설정해주세요.

 

Mesh Renderer

 - Cast Shodow : 오브젝트의 그림자가 다른 오브젝트에 그려집니다.

 - Receive Shadow : 다른 오브젝트의 그림자를 받음. 캐릭터 그림자는 받는다면 체크.

 

GI(Global Illumination) : 간접광

 

빛나는 이펙트 쉐이더 Mobile- particles - additive

 

Inspector에서 Scale Factor의 수치가 1인지 확인해줘야 함

 

FBX 메쉬 설정

Read/Write Enabled : 기본값은 체크 해체.

                            렌더링에 사용되는 텍스쳐가 스크립트에서 변경될 일이 있다면 On.

 

밉맵(Generate Mip Maps)

 - 밉맵을 사용하지 않으면 유니티 Quality Settings - Texture Quality에 대한 적용을 받지 않습니다.

   즉 다운사이징을 수행하지 못하고 원래의 해상도로 로딩됩니다.

 - 체크하면 거리가 멀어질 경우 저해상도 버전의 텍스쳐가 적용되어 깨져보일 수 있습니다.

 

패턴 만드는 Offset 기능 활용

Offset은 512 텍스쳐를 Filter-Other-Offset 에서 256(원본의 절반크기)를 적용하는 게 일반적

 

 1) 가운데 + 형태로 패턴이 이어지지 않을텐데

      Offset을 적용했던 레이어를 1장 복사해서 offset을 한 번 더 적용

 

 2) 새로 만들어진 레이어를 정사각형에 꽉 차는 원모양으로 영역을 선택해서

      Feather 값 20~30 정도 적용해주면 좋다

 

비슷한 패턴 흔적 없애는 방법

포토샵 영역 선택 후 Shift+F6으로 Feather 값을 주면 양끝이 흐려짐

댓글

💲 추천 글