Unity 검색

라이트매핑에 자주 발생하는 다섯 가지 문제와 솔루션

2022년 9월 27일 테크놀로지 | 18 분 소요
Tech from the Trenches | Progressive Lightmapping guide, hero image
Tech from the Trenches | Progressive Lightmapping guide, hero image

개발자가 Unity 에디터에서 베이크된 전역 조명(GI)를 최대한 활용할 수 있도록 돕는 프로그레시브 라이트매퍼 솔루션 가이드가 완성되었습니다. 이번 포스팅에서는 각종 이미지와 Unity 매뉴얼 페이지에 대한 링크를 활용하여 라이트매핑에서 자주 발생하는 문제 다섯 가지와 그 해결 방안을 소개합니다. 전체 가이드는 포럼에서 확인하실 수 있습니다.

1. 씬에 베이크된 전역 조명이 없는 경우

Cornell Box scene rendered with no Global Illumination (left) and with Baked Global Illumination (right)
전역 조명을 적용하지 않고 렌더링한 코넬 상자(왼쪽), 베이크된 전역 조명을 적용한 코넬 상자(오른쪽)

몇 가지 필수 요건이 충족되지 않는 경우 프로그레시브 라이트매퍼가 씬에서 조명을 생성하지 못할 수 있습니다. 이러한 조건에는 다음 경우가 포함됩니다.

  • GI 컨트리뷰터로 표시된 오브젝트가 없음
  • 씬에 베이크된 광원이 없음
  • 셰이더 문제

이 문제를 해결하려면 아래에 제시된 해결 방법 중 하나를 시도해 보세요.

게임 오브젝트를 GI 컨트리뷰터로 표시

Contribute GI settings under the Mesh Renderer component.
Mesh Renderer 컴포넌트에서 Contribute GI 설정

라이트매핑하려는 오브젝트를 다음 단계에 따라 GI 컨트리뷰터로 표시하세요.

  1. 게임 오브젝트를 선택합니다.
  2. Mesh Renderer 컴포넌트로 이동합니다.
  3. Lighting 헤더를 펼칩니다.
  4. Contribute Global Illumination 체크박스를 선택합니다.

이렇게 하면 아래에 Receive Global Illumination 파라미터가 활성화됩니다. 여기에는 두 가지 옵션이 포함됩니다.

  • Lightmaps: 라이트매핑된 정적 오브젝트를 위한 옵션으로, 게임 오브젝트가 GI를 수신하고 라이트맵에 기여합니다.
  • Light Probes: 라이트매핑에 적합하지 않은 작은 프랍과 오브젝트를 위한 옵션으로, 게임 오브젝트가 GI를 라이트 프로브에서 수신하고 주변 라이트맵에 기여합니다.

씬 광원 검사

혼합 및 베이크된 광원만 베이크된 GI에 기여할 수 있습니다. 씬에서 광원을 선택한 다음 Light 컴포넌트에서 ModeMixed 또는 Baked로 설정합니다. 그 외에 다음과 같은 프로퍼티를 확인하면 좋습니다.

  • Color: 어두운 색상은 GI 기여도가 낮거나 전혀 없습니다. 광원으로 밝은 색상을 선택하고 Intensity 프로퍼티를 사용하여 더 밝게 또는 어둡게 만듭니다.
  • Intensity: 강도가 높을수록 광원이 밝아집니다. GI에 유의미한 기여를 할 정도로 충분히 밝은지 확인합니다.
  • Indirect Multiplier: 이 프로퍼티는 간접 반사의 강도를 제어합니다. 0으로 설정하지 않도록 합니다. 아니면 광원이 GI에 전혀 기여하지 않게 됩니다. 참고로 이 값을 1보다 높게 설정하면 씬의 조명이 물리 기반 렌더링(PBR) 표준을 준수하지 않게 됩니다.

조명 설정 에셋 검사

Lighting 창(Window > Rendering > Lighting)에서 Lighting Settings Asset 필드를 공란으로 두지 않습니다. 할당된 에셋이 없는 경우 New Lighting Settings 버튼을 클릭합니다. 그러면 에셋이 생성되어 할당되며 편집할 수 있도록 창에 프로퍼티가 표시됩니다.

이 과정이 완료되었으면 다음을 확인합니다.

  • 베이크된 GI 계산을 활성화하는 Baked Global Illumination 체크박스를 선택합니다. 이 체크박스에는 Lighting Mode 드롭다운 목록도 표시됩니다.
  • Max Bounces 값이 0으로 설정되어 있지 않습니다. 이 값이 클수록 환경에서 광원이 더 많이 반사됩니다.
  • Indirect Intensity 슬라이더가 0으로 설정되어 있지 않습니다. 이 슬라이더를 0으로 설정하면 씬의 모든 간접 조명이 줄어듭니다.

셰이더 및 머티리얼 검사

커스텀 셰이더로 인해 GI 계산이 실패할 수도 있습니다. 디버그 목적으로 Unity 에디터와 함께 제공되는 다음 빌트인 셰이더를 사용하세요.

  • Standard Shader: 빌트인 렌더 파이프라인에서 사용 가능
  • Lit Shader: 유니버설 렌더 파이프라인(URP)에서 사용 가능
  • Lit Shader: 고해상도 렌더 파이프라인(HDRP)에서 사용 가능

위에 제시된 셰이더 중 하나로 전환한 후 Unity에서 조명이 생성된다면 커스텀 셰이더와 관련된 문제일 수 있습니다. 이러한 경우, 표면 셰이더에 LIGHTMAP_ON 셰이더 키워드를 포함합니다.

셰이더를 사용하여 베이크된 GI 출력을 추가로 커스터마이징하는 방법에 대한 자세한 내용은 Meta Pass 페이지에서 확인하세요.

기타 가능한 해결 방법

위에 제시된 단계로 문제가 해결되지 않으면 다음과 같은 해결 방법을 고려해 볼 수 있습니다.

  • Lighting 창에서 다른 라이트매핑 백엔드를 선택합니다. 프로그레시브 GPU를 사용하면 조명의 베이크에 실패하고, 프로그레시브 CPU를 사용했을 때 성공한다면 하드웨어나 드라이버 문제로 인한 결과일 수 있습니다.
  • GPU 드라이버를 업데이트합니다. 시스템에 적합한 드라이버는 GPU 제조업체 페이지를 참조하세요. (Linux의 경우 이 포럼 스레드의 Linux 드라이버 설정 섹션을 확인하세요).
  • GPU가 최소 사양을 충족하는지 확인합니다. 이 포럼 스레드를 참조하세요.
  • GI 캐시를 삭제합니다. 캐시를 지우려면 Preferences > GI Cache로 이동하여 Clean Cache 버튼을 클릭합니다. 캐시를 지우면 씬의 모든 조명 데이터가 삭제되며 조명을 다시 생성해야 합니다.

2. 오브젝트에서 조명이 누락된 경우

특정 오브젝트가 조명을 받지 못해 주변과 어울리지 않는 느낌이라면 씬 설정 문제일 수 있으며, 이는 동적 오브젝트에 조명을 샘플링할 라이트 프로브가 없는 경우 발생합니다. 뿐만 아니라 로컬 반사 프로브가 없다면 씬에서 광택을 가진 메탈릭 머티리얼이 모두 검은색으로 나타날 수 있습니다.

Cornell Box scene with a non-lightmapped metallic sphere and a statue: Both objects are black when no Light Probes or Reflection Probes are present (left). Diffuse statue is visible when lit by Light Probes (center). Both the reflective sphere and the statue are visible after placing Light Probes and Reflection Probes (right).
라이트매핑되지 않은 금속 구체와 조각상이 있는 코넬 박스 씬: 라이트 프로브 또는 반사 프로브가 존재하지 않는 경우 두 오브젝트 모두 검은색(왼쪽). 라이트 프로브의 조명을 받으면 디퓨즈 조각상이 보임(중앙). 라이트 프로브와 반사 프로브를 배치한 후 반사 구체와 조각상 모두 보임(오른쪽).

이 문제를 해결하려면 아래에 제시된 해결 방법 중 하나를 시도해 보세요.

라이트 프로브 배치

동적 오브젝트(또는 라이트 프로브에서 GI를 수신하는 GI 컨트리뷰터)에는 간접 조명 데이터를 샘플링하기 위한 라이트 프로브가 필요합니다. 라이트 프로브가 존재하지 않는 경우 오브젝트는 앰비언트 프로브(씬에 항상 존재하는 라이트 프로브와 반사 프로브)를 샘플링하게 됩니다.

이를 완화하려면 씬에 라이트 프로브 네트워크를 설정하여 중요한 영역에 프로브를 추가합니다. 영향을 받는 모든 오브젝트를 둘러쌀 만큼 충분한 수의 라이트 프로브를 배치하고, 조명을 다시 생성하여 효과를 확인합니다.

반사 프로브 배치

라이트 프로브 네트워크를 조밀하게 배치한 후에도 여전히 반사 메탈릭 오브젝트가 검은색으로 렌더링될 수 있습니다. 이러한 오브젝트를 셰이딩하려면 영향을 받는 오브젝트를 둘러싸도록 반사 프로브를 배치해야 합니다. 조명을 다시 생성하거나, Bake 버튼을 클릭하여 Reflection Probe 컴포넌트의 프로브를 다시 베이크합니다.

반사에서 검은 영역을 발견했다면 Bounces 수를 늘려 적용해 봅니다. 이렇게 하면 반사 수가 늘어나 반사 내에서 반사가 생성됩니다. Lighting > Environment > Environment Lighting에서 이 프로퍼티를 조절할 수 있습니다.

Mesh Renderer 설정 검사

이전 단계를 수행해도 여전히 문제가 해결되지 않는 경우 영향을 받는 오브젝트의 Mesh Renderer 컴포넌트를 확인합니다. Probes 섹션에서 Light ProbesReflection PropertiesOff가 아닌 다른 값으로 설정합니다.

Light Probes and Reflection Probes properties need to be set to Blend Probes (or anything other than Off).
Light Probes와 Reflection Probes를 Blend Probes 또는 Off가 아닌 다른 값으로 설정

머티리얼 색상 값 조정

순수한 검은색 머티리얼은 직접광과 간접광을 모두 흡수하며 이는 물리적으로 올바른 동작 방식입니다. 실제 환경에서 자연적으로 발생하는 머티리얼이 완벽한 검은색을 갖는 경우는 없습니다. 가장 어두운 색의 천연 물질인 석탄도 RGB 색상 공간에서는 '50, 50, 50'으로 측정됩니다.

물리 기반의 셰이딩 표준을 따르도록 머티리얼 색상 값을 조정하세요. 빌트인 렌더 파이프라인에서 Validate Albedo, 씬 뷰 드로우 모드를 사용하여 알베도 값이 PBR을 준수하는지 확인할 수 있습니다. URPHDRP에서는 렌더링 디버거를 사용하여 동일한 작업을 할 수 있습니다.

씬 설정 확인

여러 씬을 작업하는 경우 조명이 포함된 씬이 액티브 씬으로 설정되어 있는지 확인합니다. 기본적으로 Unity에서는 첫 번째로 로드된 씬이 액티브 씬으로 설정되며 이는 스탠드얼론 플레이어 빌드에 바람직하지 않은 영향을 미칠 수 있습니다.

3. 발광 머티리얼이 렌더링되지 않는 경우

The plane in the ceiling and the sphere both have emissive materials applied to them (left). Bloom is enabled as a post-processing effect to give the impression of a glowing material (center). Emissive plane and sphere are both marked as GI Contributors influencing lighting in the scene (right).
천장의 평면과 구체 모두에 발광 머티리얼이 적용됨(왼쪽). 포스트 프로세싱 효과로 블룸이 활성화되어 빛나는 머티리얼의 느낌을 부여(중앙). 발광 평면과 구체 모두 씬에서 조명에 영향을 주는 GI 컨트리뷰터로 표시됨(오른쪽).

발광(emissive) 머티리얼 렌더링과 관련하여 다음과 같은 두 가지 유형의 문제가 있습니다.

  • 발광 머티리얼이 '빛나게' 표시되지 않는 경우 포스트 프로세싱 관련 문제입니다.
  • 발광 머티리얼이 전역 조명에 기여하지 않는 경우 오브젝트 또는 머티리얼 설정 관련 문제입니다.

이러한 문제를 해결하려면 아래에 제시된 해결 방법 중 하나를 시도해 보는 것이 좋습니다.

포스트 프로세싱 스택에서 블룸 활성화

빛나는 머티리얼의 느낌을 구현하려면 포스트 프로세싱 스택 옵션에서 Bloom을 활성화합니다. 추가 팁은 빌트인 RP, URP 또는 HDRP 기술 자료를 참조하세요.

머티리얼 프로퍼티 확인

라이트매핑에 발광 오브젝트를 사용하려면 다음을 확인합니다.

  • 해당 게임 오브젝트를 GI 컨트리뷰터로 표시합니다. 발광 오브젝트는 자체적으로 조명을 발산하는 특성을 가지고 있으므로 Receive Global Illumination 프로퍼티를 Light Probes로 설정합니다. 이렇게 하면 라이트맵 아틀라스에서 공간이 절약됩니다.
  • Material Inspector에서 Global Illumination 프로퍼티를 Baked로 설정합니다. 이 프로퍼티는 Emission에서 변경할 수 있습니다. 자세한 내용은 빌트인 RP, URP 또는 HDRP 기술 자료를 참조하세요.
Material Inspector in the Built-in Render Pipeline: We highlighted Emission properties in blue.
빌트인 렌더 파이프라인의 Material Inspector: Emission 프로퍼티가 파란색으로 강조 표시되어 있음

조명 설정 검사

Lighting 창에서 Indirect Intensity 프로퍼티가 0 외의 다른 값으로 설정되어 있는지 확인합니다. 0으로 설정하면 베이크된 발광 오브젝트의 베이크된 광원 기여를 포함하여 모든 간접 조명이 비활성화됩니다.

4. 평평한 노멀 맵

비방향성 모드에서 베이크하는 경우 Unity 에디터는 방향성 정보를 담기 위한 별도 텍스처를 생성하지 않습니다. 이에 따라 베이크 이후에 오브젝트가 평평하게 보이게 됩니다.

주파수가 낮은 노멀 맵은 방향성 텍스처를 사용하여 캡처하기 어렵다는 점에 주목할 필요가 있습니다. 완전히 베이크된 광원을 사용하여 조명을 생성하면 이러한 텍스처는 평평하게 표시됩니다.

Non-directional lightmaps with a baked light (left) vs Directional lightmaps with a baked light (right): Non-directional lightmaps lack the directionality of incoming light, which provides a good representation of relief when using normal maps.
베이크된 광원이 있는 비방향성 라이트맵(왼쪽)과 베이크된 광원이 있는 방향성 라이트맵(오른쪽): 비방향성 라이트맵에는 유입 광원의 방향성이 결여되어 있어 노멀 맵 사용 시 입체적 묘사가 우수함

이 문제를 해결하려면 아래에 제시된 해결 방법 중 하나를 시도해 보세요.

방향성 모드로 전환

Directionality mode drop-down in the Lighting settings window.
조명 설정 창의 방향성 모드 드롭다운

Lighting 창에서 Directional Mode 프로퍼티를 Directional로 설정합니다. 이 모드에서는 주 광원 방향을 저장할 보조 텍스처가 생성됩니다. 노멀 맵에서는 우수한 입체적 묘사가 구현되나 스페큘러 반응은 결여됩니다.

혼합 광원 사용

혼합 광원은 실시간 스페큘러 반응과 노멀 반응을 제공하며, 프로그레시브 라이트매퍼는 간접 조명을 라이트맵으로 베이크합니다. 이 조합을 사용하면 베이크된 조명을 사용할 때 고품질 머티리얼 반응을 보장할 수 있습니다.

Directional lightmaps illuminated by a Baked spotlight (left) vs Directional lightmaps illuminated by a Mixed spotlight (right): Notice the improved contrast in the normal maps in the scene lit by the Mixed light.
베이크된 스폿 광원으로 조명이 적용된 방향성 라이트맵(왼쪽)과 혼합 스폿 광원으로 조명이 적용된 방향성 라이트맵(오른쪽): 혼합 광원이 적용된 씬의 노멀 맵에서 콘트라스트가 개선됨

가능한 경우 Light 컴포넌트에서 광원의 ModeMixed로 전환합니다. 참고로 혼합 광원의 성능 비용은 실시간 광원과 동일합니다. 사용된 조명 모드에 따라 혼합 광원에는 베이크된 소프트 섀도우가 아닌 실시간 그림자가 드리워집니다.

라이트 프로브 사용

베이크된 광원의 조명을 받는 것보다 프로브 조명을 사용하는 게임 오브젝트의 머티리얼 반응이 더 우수한 경우가 많습니다. 아트 방향성에서 허용되는 경우 Mesh Renderer 컴포넌트에서 Receive Global Illumination 프로퍼티를 Light Probes로 설정합니다. 참고로 Light Probe Proxy Volume(LPPV)을 사용하여 프로브 릿(probe-lit) 오브젝트에 공간 그레디언트를 추가할 수도 있습니다.

5. 스페큘러 반응이 누락된 경우

A simple scene containing several Baked point lights before a lightmap bake (left) vs same scene after baking lightmaps (right): Notice that specular highlights are missing after baking.
라이트맵 베이크 적용 이전에 여러 베이크된 점 광원이 포함된 간단한 씬(왼쪽), 라이트맵 베이크가 적용된 동일한 씬(오른쪽): 베이크 후 스페큘러 하이라이트가 누락됨

베이크된 광원의 제한 사항 중 하나는 머티리얼에 실시간 스페큘러 반응을 제공하지 않는 것입니다. 즉, 조명이 생성된 후 광이 나는 머티리얼에서 스페큘러 하이라이트가 결여됩니다.

이 문제를 해결하려면 아래에 제시된 해결 방법 중 하나를 시도해 보세요.

혼합 광원 사용

베이크된 광원과 달리 혼합 광원은 머티리얼에 실시간으로 직접 스페큘러 반응을 제공합니다. 씬에서 스페큘러 하이라이트가 중요한 경우 Light 컴포넌트에서 ModeMixed로 전환합니다.

발광 프록시 사용

발광 오브젝트를 사용하여 광원의 스페큘러 반응을 모방할 수 있습니다. 다음 단계를 따라 설정하세요.

  1. 씬에 반사 프로브를 배치합니다.
  2. Hierarchy 패널을 마우스 오른쪽 버튼으로 클릭하고 3D Object > Sphere를 선택합니다. 
  3. 새로 생성된 오브젝트를 선택하고 Static Editor FlagReflection Probe Static으로 설정합니다.
  4. Project 패널에서 마우스 오른쪽 버튼을 클릭하고 Create > Material을 선택하여 새 머티리얼을 만듭니다.
  5. 새로 생성된 머티리얼을 선택하고 Emission 체크박스를 활성화합니다. Global Illumination 프로퍼티를 None으로 설정합니다.
  6. 머티리얼을 드래그 앤 드롭하여 구체에 할당합니다.
  7. 구체를 광원과 동일한 위치에 배치합니다.
  8. 조명을 생성합니다.

위 단계를 수행하면 반사 프로브 큐브맵에 캡쳐된 발광 오브젝트를 볼 수 있습니다. 베이크 이후 발광 오브젝트를 숨기거나 Camera 컴포넌트에서 Culling Mask를 설정할 수 있습니다.

Same scene but with emissive proxies captured by the Reflection Probe (left) vs an alternative perspective showcasing the placement of said proxies (right)
동일한 씬을 대상으로 반사 프로브에 의해 캡처된 발광 프록시가 있는 경우(왼쪽)와 해당 프록시 배치를 보여 주는 또 다른 시점(오른쪽)

프로그레시브 라이트매퍼와 관련된 문제 해결 추가 팁은 포럼에서 전체 가이드를 참조하세요. 이번 포스팅에 나온 내용에 관해 논의하거나 다른 해결책을 공유하고 싶다면 여기를 통해 메시지를 전송해주세요. 아울러, 연재 중인 Tech from the Trenches 시리즈에서 다른 Unity 개발자가 작성한 새로운 기술 블로그도 꼭 확인해 보시기 바랍니다.

2022년 9월 27일 테크놀로지 | 18 분 소요
관련 게시물