기본 개념
드로우콜
- CPU 가 GPU에게 오브젝트를 그리라는 명령을 호출하는 것
- 메쉬 / 텍스쳐 / 쉐이더 / 트랜스폼 / 알파 여부 등의 정보
- 기본적으로 메쉬가 여러개인 경우 증가
- 머티리얼이 여러개인 경우도 증가
- 쉐이더중 아웃라인은 두번 렌더링하기 때문에 드로우콜은 2가 됩니다.
Batch
- DP Call 과 상태변경을 포함하는 넓은 의미의 드로우콜
SetPass
- 상태 변경(쉐이더로 인한 렌더링 패스 횟수)
- CPU 성능 소모
- 서로 다른 메쉬라도 동일한 머티리얼을 사용하면 SetPass는 1이다. (Batch는 메쉬의 수만큼 증가)
Batching
- 여러개의 배치를 하나로 묶어서 하나의 배치로 만드는 것. (드로우콜을 하나로 묶는 과정)
- 메쉬가 다른데 머티리얼을 공유하면 1개의 드로우콜로 표현하는 것이 가능.
Static Batching
- 런타임(게임중)동안 움직이지 않는 오브젝트를 스태틱으로 설정.
- 런타임 성능 향상 vs 스태틱 설정시 메모리가 추가로 필요해서 어느 설정이 괜찮을지는 테스트가 필요합니다.
- 스태틱 설정으로 배경의 모듈화 방식이 가능하며 성능면에서 효율적입니다.
오클루전 컬링
- 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에 있음)
라이트맵
기본 설정
- 디렉셔널 라이트는 기본적으로 Realtime Mode로 되있는데 라이트맵에 영향을 주지 않습니다.
- 라이트를 Mixed or Baked Mode로 설정해줍니다.
- 라이트맵에 영향을 주고 싶은 라이트는 Baked로 설정
- 오브젝트는 Static으로 설정
- 오브젝트의 Mesh Renderer - Lightmap Static 체크
- 메쉬(FBX)의 Model - Generate Lightmap UVs 체크하면 라이트맵용 두번째 UV 채널이 자동으로 생성됩니다.
(3DMax 에서 직접 2번 채널에 UV를 설정해줄 수 도 있습니다.)
- Realtime Lighting 해제
라이트맵 셋팅
Lightmapper - Progressive : 라이트맵 베이크 과정을 확인 가능합니다.
- Lightmap Resolution : 라이트맵 픽셀(텍셀)의 밀도.
낮을 수록 라이트맵 크기가 가벼워지나 그림자 퀄리티가 떨어지게 됩니다.
- Lightmap Size : 라이트맵 텍스쳐 최대 크기, 최대 크기를 초과하면 라이트맵 장 수가 추가됩니다.
- 라이트맵이 여러 장으로 나뉘면 배칭이 깨질 확률이 높아집니다.
라이트맵이 나뉜다는 것 자체가 머티리얼과 텍스쳐가 분리된다는 뜻이기 때문이죠.
- 라이트맵 사이즈가 너무 크면 대역폭 문제를 일으킬 수 있습니다.
- Directional Mode : 노멀맵 적용은 Directional.
- Non-Directional은 노멀맵, 스펙큘러 하이라이트 표현 안합니다. 단 리플렉션 프로브는 적용되요.
Mixed Lighting 에는 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로 그림자 처리됩니다.
즉 근거리일때 오브젝트 그림자가 캐릭터에 그려집니다.
라이트 프로브
- 라이트맵은 표면에 맺히는 라이팅 정보를 저장하고, 라이트 프로브는 라이팅이 지나는 공간의 지점을 저장.
- 라이트프로브는 주변 빛의 값들을 미리 연산해서 가지고 있다가 런타임에서 표현하기 때문에
실시간 라이팅보다 가볍습니다.
- 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)
그밖에
쉐이더에서 불투명은 반드시 Rendering Mode를 Opaque로 설정해야합니다.
Transparent로 설정되있으면 불투명이라도 실제로는 투명 오브젝트로 취급되거든요.
알파테스트는 성능 저하를 일으키니 알파 블렌딩으로 설정해주세요.
Mesh Renderer
- Cast Shodow : 오브젝트의 그림자가 다른 오브젝트에 그려집니다.
- Receive Shadow : 다른 오브젝트의 그림자를 받음. 캐릭터 그림자를 받기 위해 보통은 체크.
GI(Global Illumination) : 간접광
FBX 메쉬 설정
Read/Write Enabled : 기본값은 체크 해체.
렌더링에 사용되는 텍스쳐가 스크립트에서 변경될 일이 있다면 On.
밉맵(Generate Mip Maps)
- 밉맵을 사용하지 않으면 유니티 Quality Settings - Texture Quality에 대한 적용을 받지 않습니다.
즉 다운사이징을 수행하지 못하고 원래의 해상도로 로딩됩니다.
- 체크하면 거리가 멀어질 경우 저해상도 버전의 텍스쳐가 적용되어 깨져보일 수 있습니다.