#아드리

[Unity] Lightmapping Settings 본문

카테고리 없음

[Unity] Lightmapping Settings

아두리두리 2022. 11. 15. 22:18

References

Unity에서의 조명 환경

Baked Lighting 이해하기

Unite Now: URP와 GPU Lightmapper 내 조명 표현

Unite Europe 2017: Bake it 'till you make it: An Intro to Lightmap

Lighting Windows

 

라이팅 창 - Unity 매뉴얼

라이팅 창(메뉴: Window > Rendering > Lighting)은 Unity 조명 기능의 메인 컨트롤 포인트입니다. 라이팅 창을 사용하여 씬의 조명 관련 설정을 조정하고, 미리 계산된 조명 데이터를 품질, 베이크 시간,

docs.unity3d.com

  Object Type Realtime Realtime GI  Baked GI
Lightmapper   None Enlighten Progressive / Enlighten
Light Type   Realtime Reatime Baked Mixed
Direct Light Dynamic Reatime Reatime None Realtime / Baked
Static Reatime Reatime Baked Realtime / Baked
Indirect Light Dynamic None None None None / Light Probe
Static None Precomputed Baked Baked


What is Lightmapping?

 

라이트매핑은 씬의 표면 밝기를 미리 계산하고 계산 결과를 나중에 사용하기 위해 라이트맵이라고 불리는 텍스처에 저장하는 프로세스

 

  • 라이트맵에는 직접광과 간접광이 모두 포함될 수 있다. 이 조명 텍스처는 오브젝트의 머티리얼과 연결된 셰이더에서 컬러(알베도) 및 릴리프(노멀) 같은 표면 정보와 함께 사용될 수 있다.
  • 라이트맵에 베이크된 데이터는 런타임 시 변경할 수 없다. 실시간 광원은 라이트맵이 적용된 씬 위에 오버레이시켜 추가적으로 사용할 수 있지만, 라이트맵 자체를 대화식으로 변경할 수 없다.
  • 이 방식을 사용할 경우 게임플레이 시에 광원을 실시간으로 움직일 수 있는 유용성을 잠재적인 성능 향상과 맞바꾸는 것이므로, 모바일 플랫폼처럼 성능이 낮은 하드웨어에 적합하다.

Lightmap Baking [ Window > Rendering > Lighting ] 

 

  1. 라이트맵을 적용할 메시를 검토하여 라이트맵에 적합한 UV가 있는지 확인한다. (메시 임포트 설정을 열고 Generate Lightmap UVs 설정을 활성화하면 가장 쉽게 확인할 수 있다.)
  2. 라이트맵 해상도를 설정하기 위해 라이트맵 설정(Lightmapping Settings) 섹션으로 이동하여 라이트맵 해상도(Lightmap Resolution) 값을 조정합니다.
  3. 라이트맵에 포함되려면 렌더러가 다음 조건을 충족해야 한다. 
    • Mesh Renderer 또는 Terrain 컴포넌트가 있다.
    • Contribute GI로 표시되어 있다.
    • 빌트인 Unity 머티리얼, 스탠다드 셰이더 또는 메타 패스가 포함된 셰이더를 사용한다.
  4. Lighting 창의 Scene 탭 하단에서 Generate Lighting 을 선택 

Lighting Mode

 

Mode Direct Light Indirect Light  Shadow
Baked Indirect Realtime Baked Realtime
Shadowmask Realtime   Using Shadowmask
Subtractive Realtime (Dynamic)
Baked (static)
  Realtime Shadow Caster

 


Lightmapping Settings

 

Lightmapper 

 

- Progressive Lightmapper

 

프로그레시브 라이트매퍼 - Unity 매뉴얼

프로그레시브 라이트매퍼는 고속 경로 추적 기반 라이트매퍼 시스템으로, Unity 에디터의 프로그레시브 업데이트를 통해 베이크된 라이트맵과 라이트 프로브를 제공합니다. 이 라이트매퍼 시스

docs.unity3d.com

  • 프로그레시브 라이트매퍼는 고속 경로 추적 기반 라이트매퍼 시스템으로, Unity 에디터의 프로그레시브 업데이트를 통해 베이크된 라이트맵과 라이트 프로브를 제공한다. 이 라이트매퍼 시스템은 영역이 작고 각도 오류가 없으며 겹치지 않는 UV와 차트 사이의 충분한 패딩을 필요로 한다.
  • 프로그레시브 라이트매퍼는 짧은 준비 단계를 통해 지오메트리와 인스턴스 업데이트를 처리하고 G버퍼 및 차트 마스크를 생성한다. 그런 다음 결과물을 즉시 생성한 후 점진적으로 다듬기 때문에 인터랙티브 조명 워크플로를 크게 개선할 수 있다. 또한 프로그레시브 라이트매퍼는 베이크하는 동안 예상 시간을 제공하기 때문에 베이크 시간을 더욱 쉽게 예측할 수 있다.
  • 또한 프로그레시브 라이트매퍼는 업샘플링 방식을 사용하거나 복사 조도 캐시 또는 기타 전역 데이터 구조를 사용하지 않고 각 개별 텍셀(texel)의 라이트맵 해상도 수준으로 전역 조명(GI)을 베이크할 수 있다. 또한 라이트맵 일부를 선택하여 베이크할 수 있으므로 더욱 빠르게 씬을 테스트하고 반복할 수 있다.
  • CPU : 컴퓨터의 CPU와 시스템 RAM을 사용하는 프로그레시브 라이트매퍼용 백엔드 [기본값]
  • GPU (Preview) : 컴퓨터의 GPU와 VRAM을 사용하는 프로그레시브 라이트매퍼용 백엔드 [Cpu보다 10배 빠름]

- Enlighten 

 

  • 인라이튼 베이크된 전역 조명은 사전 계산된 실시간 전역 조명 데이터에 기반하여 간접 조명을 생성. 이렇게 하면 씬의 조명을 변경한 후 새로운 라이트맵을 매우 빠르게 생성하는 장점이 있다. 그러나 인라이튼 베이크된 전역 조명은 프로그레시브 라이트매퍼보다 UV 레이아웃 제한이 더 많다.

Enlighten을 사용한 Realtime GI

 

기본적으로 실시간 광원은 씬에 Direct Light을 제공한다. 씬에서 Realtime Global Illumination(인라이튼 실시간 전역 조명)을 활성화하면 실시간 광원이 씬에 간접 조명도 제공한다. 

 

사용이 적합한 경우

 

실시간 전역 조명(실시간 GI)은 천천히 변화하는 광원에 유용하며, 씬에 중요한 시각적 영향을 준다. 하늘을 가로질러 이동하는 태양이나 밀폐된 복도에서 천천히 꺼졌다 켜졌다 하는 광원이 이러한 예에 해당한다. 이 기능은 지연과 필요한 CPU 주기 수 때문에 특수효과나 빠르게 변화하는 광원용으로 적합하지 않는다. 인라이튼 실시간 전역 조명은 중급 사양과 고사양의 PC 시스템과 콘솔을 타게팅하는 게임에 적합하다. 일부 고사양 모바일 디바이스도 이러한 기능을 사용할 만큼 성능이 뛰어날 수 있지만, 적당한 성능을 보장하기 위해서는 씬은 작게, 실시간 라이트맵의 해상도는 낮게 유지해야 한다.

 

Light Probe & Enlighten Realtime GI

 

  • 인라이튼 실시간 전역 조명을 활성화하면 라이트 프로브가 다르게 작동한다
  • 라이트 프로브는 씬 조명에서 런타임 변화에 반응하기 위해 런타임 시 반복적으로 조명을 샘플링한다.
  • 씬의 인라이튼 실시간 전역 조명을 비활성화하면 라이트 프로브가 베이크된 조명 데이터만 사용한다. 즉, 라이트 프로브는 씬 조명에서 런타임 변화에 반응하지 않는다.

광원도 그림자를 캐스트하면 Unity는 씬의 동적 게임 오브젝트와 정적 게임 오브젝트 모두 광원의 섀도우 맵에 렌더링된다. 정적 게임 오브젝트와 동적 게임 오브젝트 모두의 머티리얼 셰이더가 이 섀도우 맵을 샘플링하며, 이는 서로에게 실시간 그림자를 캐스트하기 위함이다. Shadow Distance 설정은 그림자가 사라지기 시작하여 완전히 사라지는 최대 간격을 결정하며, 이는 성능과 이미지 품질에 영향을 미친다.

인라이튼 실시간 전역 조명은 씬이 매우 작은 경우 외에는 소프트 섀도우도 포함한다. 이러한 섀도우는 보통 라이트매핑이 만들어내는 섀도우보다는 거친 느낌이다.

Shadow Distance 설정을 수정하려면 Edit > Project Settings > Quality > Shadows로 이동한다.

 

Performance Considerations

 

인라이튼 실시간 전역 조명은 여러 라이트맵을 사용하여 실시간 간접 반사를 저장한다. 때문에 이 옵션을 활성화하면 베이크된 전역 조명과 함께 사용하더라도 메모리 요구 사항이 증가할 수 있다.

인라이튼 실시간 전역 조명을 사용하면 조명을 생성하는 데 필요한 셰이더 계산의 수도 늘어난다. 인라이튼 실시간 전역 조명은 추가적인 라이트맵과 라이트 프로브를 샘플링하기 때문이다.

 

Optimizing Enlighten Realtime Global Illumination

 

인라이튼 실시간 전역 조명이 씬 조명의 변화에 충분한 속도로 응답하지 않는 경우, 몇 가지 방법으로 이러한 문제를 해결할 수 있다.

  • 실시간 라이트맵 해상도를 낮춰 런타임 시 계산을 가속화한다. Quality Settings 창에서 Realtime GI 의 CPU 사용 설정을 높인다. 이렇게 하면 대신 다른 시스템의 작업에 더 적은 CPU 시간이 할당된다. 이러한 설정이 적합한지는 프로젝트에 따라 다르다. 이 설정은 씬당 설정이므로, 프로젝트에 포함된 각 씬의 복잡도에 따라 할애할 CPU 시간을 조정할 수 있다.

Progressive Updates

 

이 설정을 활성화하면 프로그레시브 라이트매퍼가 씬 뷰에서 현재 보이는 텍셀에 먼저 변경 내용을 적용한 후 뷰 밖에 있는 텍셀에 변경 내용을 적용

 

Multiple Importance Sampling 

 

이 설정을 활성화하면 환경 샘플링에 중요도 기반 멀티 샘플링을 사용할 수 있다. 이 경우 라이트맵을 생성할 때 수렴 속도가 빨라지지만, 특정 저주파수 환경에서 노이즈가 더 많이 발생할 수 있다. 이 설정은 기본적으로 비활성화된다.

 

Direct Samples 

 

각 텍셀에서 방출된 샘플(경로)의 수. 이 설정은 프로그레시브 라이트매퍼가 직접 조명 계산에 사용하는 샘플 수를 제어한다. 이 값을 올리면 라이트맵 품질이 향상되지만 베이크 시간이 늘어난다.

 

Indirect Samples

 

각 텍셀에서 방출된 샘플(경로)의 수. 이 설정은 프로그레시브 라이트매퍼가 간접 조명 계산에 사용하는 샘플 수를 제어한다.야외 씬을 비롯한 일부 씬에서는 100개 샘플이면 충분하다. 발광 지오메트리가 있는 실내 씬의 경우에는 원하는 결과를 얻을 때까지 값을 올린다.

 

Environment Samples

 

Environment Samples 프로퍼티는 Unity가 광원을 직접 수집하기 위해 스카이박스를 향해 투사하는 총 환경 광선 수를 결정. Unity는 컨텍스트에 따라 라이트맵 텍셀 또는 라이트 프로브 포지션에서 이러한 광선을 투사한다.  값이 높을수록 결과가 더 부드러워지지만, 베이크 시간이 늘어난다.
**
HDR 스카이 박스가 있는 씬에서는 최종 라이트맵 또는 프로브의 노이즈를 줄이기 위해 더 많은 샘플이 필요한 경우가 많다. 밝은 특이점(예: 태양) 또는 콘트라스트가 뚜렷한 고주파 디테일(예: 역광 구름)이 포함된 스카이 박스가 있는 씬도 샘플 수가 많을수록 좋다.

 

Light Probe Sample Multiplier 

 

라이트 프로브에 사용되는 샘플 수를 위 샘플 값의 멀티플라이어로 제어. 값이 높을수록 라이트 프로브의 품질이 향상되지만, 그만큼 베이크 시간이 증가.  기본값은 4.

 

Bounce

 

이 값을 사용하면 경로 추적에 사용할 간접 바운스 수를 지정할 수 있다. 대부분의 씬에서는 2개 바운스면 충분하다. 일부 실내 씬의 경우 더 많은 바운스가 필요하다.

 

  • Min - 낮은 값은 베이킹 시간을 단축시키지만 라이트맵 노이즈를 증가시킬 수 있다. 베이킹 중 성능을 향상시키기 위해 라이트매퍼는 러시안 룰렛이라는 기술을 사용하여 씬의 형상에 거의 기여하지 않는 광원 경로를 종료한다.
  • Max - 최대 10의 값이 대부분의 씬에 적합. 값이 10보다 크면 베이킹 시간이 상당히 오래 걸릴 수 있다.
    바운스가 발생할 때마다 씬을 굽는 데 필요한 계산을 요구하는 리소스가 늘어난다. 실내 씬에는 더 높은 바운스 값을 사용하고 야외 씬과 밝은 표면이 많은 씬에는 더 낮은 바운스 값을 사용.

 

Filtering 

 

노이즈를 줄이기 위해 프로그레시브 라이트매퍼가 라이트맵에 포스트 프로세싱 효과를 적용하는 방식을 설정한다. 라이트맵 포스트 프로세싱의 경우 라이트맵은 Unity가 단일 라이트맵으로 합성하기 전에 포스트 프로세싱을 개별적으로 적용하는 Direct, Indirect  Ambient Occlusion 타겟으로 분할된다.

 

**

 

- Direct: 조명에서 센서(보통 카메라)에 직접적으로 도착하는 광원
- Indirect: 조명에서 센서에 간접적으로 도착하는 광원. 일반적으로 다른 게임 오브젝트에서 반사되는 광원에 적용.
- Ambient Occlusion: 조명 시스템이 계산하는 주변광

 

  • None: 이 설정을 선택하면 라이트맵에 필터나 노이즈 감소를 사용하지 않습니다
  • Auto: 이 설정을 선택하면 라이트맵의 포스트 프로세싱에 플랫폼별 프리셋을 사용.
    개발용 컴퓨터가 OptiX(NVIDIA OptiX AI 가속 디노이저)를 실행하기 위한 요구 사항을 충족하는 경우 프로그레시브 라이트매퍼는 모든 타겟에 대해 1텍셀 반지름을 가진 가우스 필터가 포함된 디노이저를 사용.
    개발용 컴퓨터가 OptiX를 실행할 수 없는 경우 프로그레시브 라이트매퍼는 Direct에 대해 1텍셀 반지름, Indirect에 대해 5텍셀 반지름, Ambient Occlusion에 대해 2텍셀 반지름을 가진 가우스 필터를 사용.
  • Advanced: 라이트맵 타겟의 유형에 대한 옵션을 수동으로 설정. 타겟 유형은 Direct, Indirect, Ambient Occlusion이 있다. 
Denoiser Nvidia Optix: 베이크된 라이트맵의 노이즈를 줄여주는 AI 가속 디노이저
NVIDIA GPU, 4GB+ VRAM 및 드라이버 버전 390+를 필요로 하고 Windows 플랫폼에서만 지원

RadeonPro: 베이크된 라이트맵의 노이즈를 줄여주는 AI 가속 디노이저
OpenCL 지원 GPU와 4GB+ VRAM을 필요로 한다.

Intel
 
OpenImageDenoise: 베이크된 라이트맵의 노이즈를 줄여주는 AI 가속 디노이저

None
: 디노이저를 사용하지 않는다.
Filter Gaussian: 이 옵션을 선택하면 라이트맵 타겟에 가우스 필터를 사용
가우스 필터는 라이트맵에 대칭 가우스 필터를 적용합니다. 그러면 라이트맵을 흐릿하게 만들어 눈에 보이는 노이즈를 줄입니다.

A-Trous: 이 옵션을 선택하면 라이트맵 타겟에 A-Trous 필터를 사용합니다. A-Trous 필터는 블러 정도를 최소화하고 라이트맵에 보이는 노이즈를 제거한다.

None: 이 옵션을 선택하면 라이트맵 타겟에 대한 모든 필터링을 비활성화한다.
Radius 이 옵션은 Filter Gaussian으로 설정된 경우에만 사용할 수 있다. Radius 값을 사용하여 가우스 필터 커널의 반지름을 텍셀 단위로 설정. Radius 값을 높이면 블러 세기가 증가하고 눈에 띄는 노이즈가 감소하지만, 조명 디테일이 손실될 수 있다.
Sigma 이 옵션 Filter A-Trous로 설정된 경우에만 사용할 수 있다. Sigma 값을 사용하여 보존할 디테일 양 또는 조명의 블러 정도를 조정. Sigma 값을 높이면 블러 세기가 증가하고 눈에 띄는 노이즈가 감소하지만, 조명 디테일이 손실될 수 있다.

 

**

Indirect Resolution

 

Indoor: 2-3

Outdoor: 0.5-1

Terrains:0.1-0.5

 

**

Lightmap Resolution 

 

 about 10 times higher  [starting point] 

 

Directional Mode

 

라이트맵에는 방향성 비방향성의 두 가지 방향성 모드가 있다. 두 모드 모두 Unity의 인라이튼 실시간 전역 조명 시스템의 실시간 라이트맵, Unity의 프로그레시브 라이트매퍼의 베이크된 라이트맵과 호환된다. 기본 모드는 방향성이다.

  • 방향성 라이트맵을 베이크하면 Unity는 두 개의 라이트맵 텍스처를 생성한다. 한 텍스처는 타겟 표면에서 받은 조명의 강도 및 컬러에 대한 정보를 저장한다. 이는 비방향성 라이트맵과 동일하다. 나머지 한 텍스처는 우세한 광원 방향, 그리고 우세한 광원 방향에서 받은 총 광원량을 설명하는 팩터를 저장한다.

Directional Mode Off

Directional Mode On

  • Directional Mode 라이트맵은 두 개의 텍스처로 구성되고, 셰이더는 렌더링 중에 두 텍스처를 모두 샘플링한다. 추가 텍스처는 비디오 메모리 요구 사항을 증가시킨다. 추가 방향성 텍스처를 생성해도 베이크 성능에 영향을 준다.
  • None Directional Mode 라이트맵에는 단일 텍스처만 포함된다. 그 결과, 방향성 맵보다 더 적은 비디오 메모리와 더 적은 스토리지를 필요로 하고, 셰이더에서 디코딩 속도가 더 빠르다. 이러한 최적화는 화질을 저하시킨다.

Ambient Occulsion (AO)

 

  • 서로 가까이 있는 주름, 구멍 및 표면을 시뮬레이션하는 기능.
  • 이 영역은 주변광을 가리므로(차단하므로) 더 어둡게 나타난다.
  • 표면의 한 지점에 닿을 수 있는 주변광을 근사함으로써 서로 가까이 있는 주름, 구멍, 표면을 어둡게 만든다.
  • 앰비언트 오클루전을 사용하면 조명에 사실감을 더할 수 있다.
  • 베이크된 전역 조명이 씬에서 활성화되면 Unity는 앰비언트 오클루전을 라이트맵으로 베이크할 수 있다. 이를 베이크된 앰비언트 오클루전이라고 한다.

 

Statistics

 

Auto Generate  Generate Lighting 옵션 밑에 있는 패널에는 다음과 같은 라이트매핑 통계가 표시된다.

 

  • Unity가 생성한 라이트맵 개수
  • Memory Usage: 현재 라이트매핑에 필요한 메모리 양
  • Occupied Texels: 라이트맵 UV 공간에서 사용된 텍셀 수
  • Lightmaps in view: 씬 뷰에 있는 라이트맵 개수
  • Lightmaps not in view: 씬 뷰 밖에 있는 라이트맵 개수
    • Converged: 이 라이트맵에 대한 계산은 완료된 상태
    • Not Converged: 이 라이트맵에 대한 베이킹이 아직 진행 중
  • Bake Performance: 초당 광선 수. 이 값이 2보다 낮으면 설정을 조정해야 한다. 그러지 않으면 하드웨어가 한 번에 더 많은 광선을 처리해야 한다

 

Lightmap UV 

 

반적으로 UV라고 불리는 텍스처 좌표는 지오메트리 주위에 텍스처를 “래핑”하는 방법을 말한다. 라이트맵은 텍스처이므로 Unity에서 씬을 올바르게 사용하려면 UV가 필요하다.

  • Realtime / Baked GI 조명 시스템은 모두 라이트맵을 사용하므로 라이트맵 UV가 필요하다.
  • Unity는 실시간 전역 조명 시스템과 베이크된 전역 조명 시스템에 대해 별도의 라이트맵 UV 세트를 사용합니다. 여기에는 다음과 같은 두 가지 이유가 있습니다.
    • 실시간 라이트맵과 베이크된 라이트맵 사이의 인스턴스 그룹화에는 직접적인 대응 관계가 없습니다. 동일한 실시간 라이트맵에 있는 인스턴스는 서로 다른 두 개의 베이크된 라이트맵에 있을 수도 있고 없을 수도 있습니다.
    • 서로 다른 스케일로 나타나는 메시는 베이크된 라이트맵에서 라이트맵 UV를 공유하지만 실시간 라이트맵에서는 UV를 공유하지 않습니다.

Lightmap UV 생성

 

Unity는 모델을 임포트할 때 베이크된 라이트맵에 대한 UV를 계산할 수 있으며 직접 데이터를 제공할 수도 있다.

 

  • 직접 만들 경우: 선택한 컨텐츠 생성 소프트웨어에서 직접 라이트맵 UV를 작성할 수 있다. Unity는 이 UV를 소프트웨어의 계산을 위한 입력으로 사용한다다. 이 데이터를 입력하는 위치는 베이크된 라이트맵이나 실시간 라이트맵 또는 둘 모두에 대해 UV를 제공하는지에 따라 다르다.
  • 베이크된 라이트맵의 경우 
    • Mesh.uv2에 라이트맵 UV를 배치해야 한다.
    • 이 채널은 “UV1”이라고도 한다.
  • 실시간 라이트맵의 경우
    • 이미 메시의 Mesh.uv2에 베이크된 라이트맵 UV가 있고 실시간 라이트맵에 대한 입력으로 동일한 UV를 사용하려는 경우 어떤 행동도 할 필요가 없다. Unity는 베이크된 라이트맵 UV 공유로 폴백한다.
    • 이미 Mesh.uv2에 베이크된 라이트맵 UV가 있고 실시간 라이트맵에 대한 입력으로 다른 UV를 제공하려는 경우 실시간 라이트맵 UV를 “UV2”라고도 하는 Mesh.uv3을 배치한다.
    • 메시의 두 번째 채널에 베이크된 라이트맵 UV가 아직 없는 경우 실시간 라이트맵 UV에 Mesh.uv2를 사용할지 또는 Mesh.uv3을 사용할지 선택한다.

라이트맵에 적합한 UV 세트는 다음 규칙을 준수해야 한다.

  • [0,1] x [0,1] UV 공간 안에 포함되어야 한다.
  • 개별 차트 사이의 마진이 충분히 커야 한다. 
  • 겹치는 면이 없어야 합니다.
  • UV의 각도와 원래 지오메트리의 각도 간에 차이가 크지 않아야 한다.
  • 일부 영역의 라이트맵 해상도를 더 크게 하려는 경우를 제외하고, UV에 있는 삼각형의 상대적인 스케일과 원래 지오메트리에 있는 삼각형의 상대적인 스케일 차이가 크지 않아야 한다.

Unity Generate Lightmap UVs

 

모델 임포트 설정을 사용하여 Unity가 모델용 라이트맵 UV를 자동으로 생성하도록 설정할 수 있다.

  1. 프로젝트 뷰에서 모델을 선택, 그러면 인스펙터에서 모델 임포트 설정이 열린다.
  2. 모델 임포트 설정에서 Model 탭으로 이동한 후 Geometry 섹션을 선택한다.
  3. Generate Lightmap UVs 체크박스를 선택. 그러면 Lightmap UVs settings 섹션이 Generate Lightmap UVs 체크박스 아래에 나타난다.
  4. 선택 사항: Lightmap UVs settings 섹션에서 설정을 지정합니다. 
  5. Apply 버튼을 클릭. Unity가 라이트맵 UV를 Mesh.uv2 채널에 생성한다.
Hard Angle 인접 삼각형 사이의 각도(도 단위)가 이 값을 초과하면 삼각형이 하드 에지로 간주되어 경계 부분이 생성된다. 0과 180 사이의 값으로 설정할 수 있다. 기본값은 88도로 설정되어 있다.

180도로 설정하면 모든 에지가 부드러운 에지로 간주된다. 이러한 방식은 유기체 모델을 사실적으로 표현하기에 적합하며, 기계적 모델에는 기본값(88도)이 적합하다.
Angle Error UV 각도와 소스 지오메트리 각도의 최대 편차(0에서 100까지의 백분율)이다. 기본값은 8%로 설정되어 있다.
UV 공간의 삼각형이 원래 지오메트리의 삼각형과 얼마나 다를 수 있는지 설정한다. 라이트맵에 적용하는 경우 결함을 방지하려면 일반적으로 매우 낮게 설정해야 한다.
Area Error UV 영역과 소스 지오메트리 영역 간 차이의 최대값(0에서 100까지의 백분율)을 설정한다. 기본값은 15%로 설정되어 있다.

Unity가 삼각형의 면적율을 보존하는 정도를 설정한다. 값을 높게 설정하면 차트를 더 적게 생성해도 된다.하지만 값을 높게 설정하면 삼각형의 해상도가 변경될 수 있으므로 높은 값으로 인해 발생하는 왜곡 때문에 라이트맵 품질이 저하되지 않는지 확인해야한다.
Margin Method 팩 마진을 수동으로 지정할지, Unity가 자동으로 계산하도록 지정할지 여부이다.
Manual 팩 마진을 수동으로 지정
  Calculate 예상되는 라이트맵 해상도 및 오브젝트 스케일에 따라 Unity가 UV 오버랩을 피할 만큼 충분히 큰 팩 마진을 계산
  Pack Margin 메시가 1024x1024 라이트맵 전체를 차지한다는 가정 하에 인접하는 차트 간 마진(픽셀 단위)입니다. 1과 64 사이의 값으로 설정할 수 있다. 값이 클수록 마진이 커지지만 차트에 필요한 공간도 커집니다. 기본값은 4픽셀로 설정되어 있다.

이 프로퍼티는 Margin Method  Manual 로 설정한 경우에만 표시된다.
Min Lightmap Resolution 전체 씬에서 이 메시를 사용하는 메시 렌더러의 최소 라이트맵 해상도(단위당 텍셀 수). 메시 렌더러의 라이트맵 해상도는 메시 렌더러의 Scale in Lightmap 프로퍼티와 메시 렌더러가 나타나는 씬에 대한 조명 설정 에셋 Lightmap Resolution 프로퍼티의 조합이다.

Unity는 이 정보를 사용하여 팩 마진을 계산. 이 프로퍼티는 Margin Method  Calculate 로 설정한 경우에만 표시.
Min Object Scale 전체 씬에서 이 메시를 사용하는 게임 오브젝트의 최소 변환 스케일이다.

Unity는 이 정보를 사용하여 팩 마진을 계산합니다. 이 프로퍼티는 Margin Method  Calculate 로 설정한 경우에만 표시된다.

Pack Margin

 

필터링을 허용하기 위해, 라이트맵은 조명 정보를 차트 경계 부근의 텍셀에 포함하므로 라이트맵을 적용하는 경우 조명이 새어나가지 않도록 항상 차트 사이에 어느 정도의 마진을 적용해야 한다.

라이트맵 해상도에 따라 라이트맵 텍셀 해상도가 정의된다. 라이트매퍼는 검정색 에지가 발생하지 않도록 라이트맵의 차트 텍셀 일부를 팽창시키므로, 메시의 UV 차트가 서로 2텍셀 이상 떨어져 있어야만 조명이 새어나가지 않는다. 팩 마진(Pack Margin) 설정을 사용하여 지오메트리의 UV 차트 사이에 마진을 충분히 확보해야 한다.

라이트맵 UV 공간에서는 차트 간 패딩이 2텍셀 이상이어야만 UV 오버래핑 및 의도하지 않은 빛샘 현상을 방지할 수 있다. 위 이미지에서 검정색 공간은 차트 사이의 공간을 나타낸다.

 

Min Lightmap Resolution & Min Object Scale

 

  • UV 차트를 너무 가깝게 배치하면 최종 라이트맵에서 크로스 차트 텍셀 블리딩이 발생할 수 있다. 차트를 서로 너무 멀리 배치하면 메모리 낭비가 발생한다. 오브젝트의 이상적인 팩 마진은 할당된 라이트맵 텍셀 수에 따라 다르다.
  • Unity가 메시 렌더러에 사용하는 텍셀 수는 메시 렌더러의 라이트맵 해상도와 변환 스케일에 따라 다흐다. 적합한 마진을 계산하기 위해 Unity는 이러한 프로퍼티에 대한 예상 최소값을 알아야 한다.
  • 메시 렌더러의 라이트맵 해상도는 메시 렌더러가 나타나는 씬에 대한 조명 설정 에셋 Lightmap Resolution 프로퍼티와 메시 렌더러 Scale in Lightmap 프로퍼티의 조합이다. 즉 동일한 메시 렌더러가 다른 씬에서 다른 라이트맵 해상도를 사용할 수 있다.

다음 단계에 따라 인스펙터를 사용하여 특정 씬에서 메시 렌더러의 라이트맵 해상도를 확인할 수 있다.

  1. 씬 뷰 또는 계층 구조에서 MeshRenderer 컴포넌트가 있는 게임 오브젝트를 선택
  2. 인스펙터에서 MeshRenderer 컴포넌트의 Lightmapping 섹션으로 이동.
  3. Baked Lightmap 폴드아웃을 연다. 그러면 Unity가 Lightmap Resolution 레이블을 사용하여 메시 렌더러의 라이트맵 해상도를 베이크된 라이트맵에 표시하고, Lightmap Object Scale 레이블을 사용하여 해당 변환 스케일을 베이크된 라이트맵에 표시한다.

Angle Error

 

아래 스크린샷은 해상도가 같지만 UV가 서로 다르다.

 

  • 첫 번째 예시에서는 각도 오차(Angle Error) 가 크고 결과물에 의도하지 않은 결함이 포함되어 있다. 
  • 두 번째 예시에서는 기본적인 각도 오차(Angle Error)(8%)가 적용되어 있다. 메시에 삼각형이 더 많은 경우 각도 오차로 인해 형태가 크게 왜곡될 수 있다.

 

Area Error

 

아래 그림에서는 파라미터가 같은 스폿 광원 2개가 실린더 면에 조명을 비춘다. 오른쪽 실린더 면의 영역 오차(Area Error) 값이 더 커지기 때문에 삼각형이 왜곡되고 해상도가 더 낮아져 조명에 결함이 생긴다.

 

Visualizing Real-time Lightmap UVs [Realtime GI]

 

  • 씬에서 메시 렌더러로 게임 오브젝트를 선택한다
  • 조명 창을 열어 오브젝트(Object) 탭을 선택한다.
  • Preview 영역의 드롭다운에서 __Charting__을 선택한다.

메시의 선택된 인스턴스의 실시간 라이트맵에 대한 UV 레이아웃을 표시.

 

  • 차트는 미리보기에서 다른 컬러 영역으로 표시(위의 이미지는 오른쪽에 표시됨).
  • 선택된 인스턴스의 UV는 게임 오브젝트의 메시 와이어 프레임 표현으로 차트 위에 놓인다.
  • 진회색 음영은 라이트맵의 사용되지 않는 영역을 보여 준다.

여러 인스턴스를 실시간 라이트맵에 포함할 수 있으므로 실제로 볼 수 있는 차트 중 일부는 다른 게임 오브젝트에 속할 수 있다.

 

Visualizing Baked Lightmap UVs [Baked GI]

 

  • 인스턴스 선택
  • 라이팅 창(메뉴 : Window > Rendering > Lighting)을 열고 Object 탭을 선택.
  • Preview 영역의 드롭다운에서 Baked Intensity 를 선택.

보시다시피 베이크된 UV는 미리 계산된 실시간 UV와는 매우 다르다. 이는 미리 계산된 실시간 베이크된 UV에 대한 요구 사항이 다르기 때문.

 

Fixing Lightmap UV Overlap

 

각 라이트맵에는 많은 charts 가 포함되어 있다. 런타임 시점에서 Unity는 이러한 차트를 메시 면에 매핑하고, 차트의 조명 데이터를 사용하여 최종 형상을 계산한다. GPU 샘플링의 동작 방식 때문에 두 차트가 너무 인접해 있으면 한 차트의 데이터가 다른 차트로 흘러 들어갈 수 있다. 이로 인해 일반적으로 앨리어싱, 픽셀레이션 등과 같은 의도하지 않은 아티팩트가 발생한다.

 

차트 블리딩으로 인한 그래픽 결함 예제

광원 블리딩 현상을 피하려면 차트 사이에 충분한 공간을 두어야 한다. GPU가 라이트맵을 샘플링할 때 광원 시스템은 샘플링된 지점에서 가장 가까이 있는 텍셀 4개의 최종 샘플 값을 계산한다(바이리니어 필터링을 사용한다고 가정함). 이 4개의 텍셀은 샘플링된 지점의 바이리니어 “이웃(neighborhood)”이라고 부른다. 두 차트가 너무 가까이 붙어 있으면 오버랩이 발생한다. 즉, 차트 내 한 이웃 지점이 다른 차트의 이웃 지점과 겹치게 된다. 아래 이미지에서 흰색 픽셀은 차트 이웃을 표시하고, 빨간색 픽셀은 겹치는 이웃을 표시한다.

 

여러 파라미터(예: 라이트맵 해상도, 메시 UV, 임포터 설정 등)가 존재하기 때문에 최적의 차트 배치 및 간격을 결정하기가 어려울 수 있다. 따라서 Unity는 다음 섹션에 설명된 것처럼 이러한 문제들을 쉽게 식별할 수 있는 기능을 제공한다.

 

1) 오버랩은 세 가지 방식으로 식별할 수 있다.

  • Unity의 콘솔 체크. Unity가 겹치는 UV를 감지하면 경고 메시지를 출력하고 영향을 받는 게임 오브젝트 리스트를 표시함.
  • 씬(Scene) 뷰에서 UV Overlap 드로우 모드를 사용(자세한 내용은 씬(Scene) 뷰의 GI 시각화 참조). 이 모드를 활성화한 경우 Unity는 다른 차트의 텍셀과 매우 인접한 차트 텍셀에 빨간색 하이라이트를 추가한다. 이 기능은 씬 뷰에서 결함을 찾거나 UV 오버랩이 결함을 일으키는지 빠르게 조사해야 할 때 특히 유용하다.

UV 오버랩 드로우 모드를 사용하는 씬 뷰(왼쪽 상단 드롭다운 참조)

  • Baked Lightmaps Preview 를 사용. 게임 오브젝트를 선택하고 라이팅 창으로 이동한 후 Baked Lightmaps 탭을 선택합니다. 강조 표시된 라이트맵을 더블 클릭하여 미리보기 창으로 이동한 후 Baked UV Overlap(오른쪽 상단의 드롭다운 참조)을 선택. 미리보기 창은 이 뷰에서 문제가 있는 텍셀을 빨간색으로 표시한다.

Lighting 창의 Baked Lightmaps 탭에 있는 Baked Lightmaps Preview

UV 오버랩은 매우 많은 요소로 인해 발생하므로 완전한 한 가지 해결책은 없다.

 

가장 일반적으로 사용되는 몇 가지 해결책:

 

  • 라이트맵 UV를 직접 제공하는 경우 모델링 패키지를 사용하여 마진을 추가.
  • Unity가 모델용 라이트맵 UV를 자동으로 생성하는 경우 Unity가 팩 마진을 늘리도록 지시할 수 있다. 이를 위한 가장 간단한 방법은 Margin Method  Calculate 로 설정하고, 적절한 Min Lightmap Resolution  Min Object Scale 을 설정하는 것. Margin Method  Manual 로 설정하는 것을 선호하면 Pack Margin 값을 직접 조정할 수 있다. 
  • 전체 라이트맵의 해상도를 높이자. 이렇게 하면 차트 간 픽셀 수가 증가하여 블리딩이 발생할 확률이 감소한다. 단점은 라이트맵이 지나치게 커질 수 있다는 것입니다. 이 작업은 Lightmapper Settings  Lighting 탭에서 수행할 수 있다.
  • 단일 게임 오브젝트의 해상도를 높이자. 이를 통해 겹치는 UV가 있는 게임 오브젝트의 라이트맵 해상도만 높일 수 있다. 단, 가능성은 낮지만 이로 인해 라이트맵 크기가 커질 수 있다. 게임 오브젝트의 라이트맵 해상도는 Lightmap Settings 의 해당 메시 렌더러에서 변경할 수 있다.

이전과 동일한 메시이지만 블리딩 결함이 발생하지 않음

Seam Stitcing

 

프로그레시브 라이트매퍼에서 생성된 베이크된 라이트맵을 사용하여 렌더링된 게임 오브젝트에서 원치 않는 하드 에지를 부드럽게 처리하는 기능

  • Unity가 라이트맵을 베이크할 때 서로 가깝지만 서로 분리된 메시 면을 라이트맵 공간에서 분리된 면으로 식별한다. 이런 메시의 가장자리를 “경계 부분”이라고 한다. 경계 부분은 보이지 않는 것이 이상적이지만, 때로는 하드 에지가 있는 것처럼 보일 수 있다. 그 이유는 GPU가 라이트맵에서 분리된 차트의 텍셀 값을 혼합할 수 없기 때문이다.
  • 심 스티칭은 이 문제를 해결한다. 심 스티칭을 사용하면 Unity가 추가 연산을 수행하여 라이트맵을 수정하고 결과적으로 경계 부분의 모양을 개선한다. 심 스티칭이 완벽하지는 않지만 종종 최종 결과를 현저하게 개선한다. 

  • 심 스티칭을 활성화하면 라이트매퍼가 함께 스티칭해야 하는 모서리 쌍을 식별하고 경계 부분에 최대한 부드러운 조명을 생성한다. 이 조명은 아틀라스의 차트 경계를 따라 수평 또는 수직으로 이어져 있는 수직 모서리에만 적용되며 UV 공간에서 축에 정렬된 사각형과 함께 사용할 수 있도록 설계되었다.
  • 심 스티칭은 프로그레시브 라이트매퍼에서 작동한다. 또한 단일 게임 오브젝트에만 사용할 수 있고, 여러 개의 게임 오브젝트의 경우 매끄럽게 꿰맬 수 없다.
  • Mesh Renderer 컴포넌트를 사용하여 모든 게임 오브젝트에 심 스티칭을 활성화할 수 있다. 메시 렌더러 인스펙터에서 Lightmapping 섹션과 Stitch Seams 로 이동.
반응형
Comments