Fine tuning with Lightmap Parameters – 번역

Fine tuning with Lightmap Parameters

원문 링크

 

이전글 – Understading Clusters

Fine tuning with Lightmap Parameters

확인 완료한 버전: 5.5 – 난이도: 중급

유니티는, 라이트맵 파라미터의 사용을 통해서 고급 라이트매핑 제어기능을 제공합니다. 이 설정항목들은 라이트맵 파라미터 애샛(Lightmap Parameters asset)안에 저장됩니다. 라이트맵 파라미터 애샛은 씬 간의 라이트맵 설정 공유가 가능하게 합니다. 그리고 팀 개발 환경에서 공유가 가능하도록 버전이 관리 됩니다.
프로젝트 뷰에서 라이트맵 파라미터 애샛을 생성할 수 있습니다.

  • 프로젝트 뷰의 왼쪽 상단의 Create 드롭다운 메뉴를 선택하고 Lightmap Parameters 메뉴를 선택합니다 (Create > Lightmap Parameters).
  • 프로젝트 뷰에서 마우스 우클릭을 하거나, 유니티 에디터 상단의 메뉴바를 이용해서 라이트맵 파라미터 애샛(Lightmap Parameters asset)을 생성할 수 있습니다 (Asset > Create > Lightmap Parameters).

 

newlightmapparam
라이트맵 파라미터(Lightmap Parameters)를 통해서 Baked GI 와 Precomputed Realtime GI 에 대한 고급 설정이 가능합니다.

라이트맵 파라미터 애샛이 생성되면, 생성된 애샛은 스태틱 메쉬렌더러 컴포넌트에 할당됩니다. (Static MeshRenderer component)

  • 계층뷰에서 라이트맵 파라미터 애샛을 할당하려는 게임오브젝트를 선택합니다. 선택한 게임오브젝트는 반드시 Static으로 설정되고, 메쉬렌더러 컴포넌트를 가지고 있어야 합니다.
  • Lighting 창(Window > Lighting)을 열고 Object 탭을 선택합니다.
  • Advanced Parameters 드롭 다운 메뉴를 이용해서 선택한 게임오브젝트에 라이트맵 파라미터 애샛을 할당합니다. Advanced Parameters 드롭 다운 메뉴 오른쪽에 있는 ‘Edit’버튼을 이용해서 선택한 게임오브젝트에 할당된 라이트맵 파라미터 애샛을 수정할 수 있습니다.

 

advancedparams
라이트맵 파라미터 애샛은, Lighting 창의 Object 탭에 위치한 Advanced Parameters 드롭 다운 메뉴를 통해서 할당됩니다.

동일한 라이트맵 파라미터 애샛을 다수의 오브젝트에 할당할 수 있습니다. 계층뷰에서 여러 오브젝트를 선택하고 위에서 설명한 과정을 거치면 됩니다. 이 상태에서 라이트맵 파라미터를 수정하면, 이 애샛이 할당된 모든 오브젝트에 영향을 줍니다.

 

라이트맵 파라미터: 인스턴스-당? 프리팹-당? (Lightmap Parameters: per-instance or per-Prefab?)

Unwrap 설정항목과 유사하게, 개별 프리팹이나 씬에 생성된 게임오브젝트의 인스턴스에 라이트맵 파라미터 애샛을 할당할 수 있습니다.

이 접근방법의 이점은 기본설정을 가진 라이트맵 파라미터 애샛은 대부분의 경우, 프리팹에 적용될 수 있다는 점입니다. 그런 다음, 세부 설정이 필요할때, 씬을 기반(씬에 생성된 게임오브젝트의 인스턴스를 기반으로)으로 설정을 변경할 수 있습니다.

이 글에서는, 인스턴스를 기반으로, 라이트맵 파라미터 애샛을 적용하는 방법을 선택했습니다. 이는 사용되는 게임오브젝트에 따라서, 라이트맵 파라미터 애샛을 다르게 선택하고 싶었기 때문입니다.

 

기본 설정항목 (Default Parameters)

씬 전체적으로 기본 설정을 가진 라이트맵 파라미터를 설정할 수 있습니다. 이 기본 라이트맵 파라미터는, 씬에 있는 메쉬렌더러 중에서 아직 라이트맵 파라미터가 설정되지 않은 메쉬렌더러(MeshRenderer)에 모두, 이 기본 라이트맵 파라미터 애샛이 할당됩니다. 이 다음에 생성되는 모든 메쉬렌더러는 이 기본 라이트맵 파라미터를 사용하게 됩니다. 이 접근방식을 사용하면 씬의 라이팅을 설정할때 수동으로 할당하는 작업을 줄일 수 있습니다.

  • Lighting 창(Window > Lighting)을 열고 Scene 탭을 선택합니다.
  • Default Parameters 드롭다운 메뉴를 이용해서 씬에 라이트맵 파라미터 애샛을 선택합니다.

새로 생성된 오브젝트에 모두 기본 파라미터가 적용되더라도, 위에서 설명했던 대로, 오브젝트에 개별적으로 파라미터를 할당해서 기본 설정된 값을 변경할 수 있습니다.

defaultparams
새로 생성된 정적 메쉬렌더러(Static MeshRenderer)에 이 기본 파라미터가 할당됩니다.

유니티는 미리설정된 라이트맵 파라미터(preconfigured Lightmap Parameters)를 제공하는데, 이를 활용하면 씬 라이팅을 설정하는데 도움이 됩니다.
미리설정된 라이트맵 파라미터는 다음과 같습니다:

  • Default – HighResolution
  • Default – Medium
  • Default – LowResolution
  • Default – VeryLowResolution

이 라이트맵 파라미터들 중에서 하나를 할당하면, 선택한 오브젝트의 전체 라이팅 비용을 결정하는 설정이 적용됩니다. 이 설정들은 라이트맵 해상도, 글로벌 일루미네이션 파라미터(Global illumination parameters), 클러스터 해상도, 다른 개별 오브젝트 단위의 고급 설정을 포함합니다. 이 설정들은 씬 전체에서 라이팅 성능의 균형을 조정할 때 중요하는데 중요하게 사용됩니다.

 

라이트맵 파라미터 설명 (Lightmap Parameters explained)

유니티의 기본 파라미터는 많이 사용되는 몇 가지 경우에 사용할 수 있도록 준비되었고 많은 라이팅 환경에서 사용하기에 충분합니다. 미리 계산된 실시간 GI(Precomputed Realtime GI)시스템에서 좀 더 세부적인 조절이 필요한 경우, 라이트맵 파라미터 애샛을 생성한 후 설정하면 됩니다.

라이트맵 파라미터에 대한 유니티 메뉴얼 페이지는 라이트맵 파라미터 애샛에 있는 설정항목에 대한 개요를 제공합니다. 하지만, 이 글에서는, 라이팅 최적화를 위해서 가장 많이 사용되는 설정에 초점을 맞추려고 합니다.

 

해상도 (Resolution)

Resolution 값은, 이 라이트맵을 사용하는 오브젝트에서 요구하는 라이트맵 해상도를 결정합니다. Resolution 값은, Lighting 창의 Scene탭에서 지정된, 씬-전체적으로 사용되는 Realtime Resolution 값에 곱해지는 값입니다. 예를 들어, 씬의 Realtime Resolution 값이 2로 설정되고, Resolution 항목이 0.5로 설정된 경우, 이 라이트맵 파라미터가 할당된 오브젝트는 최종 라이트맵 텍스쳐에서 단위당 1 텍셀을 사용하게 됩니다.

미리 계산되는 실시간 GI(Precomputed Realtime GI)는 디퓨즈(diffuse)와 씬의 간접광(indirect lighting)만 표현하기 때문에, 라이트맵 텍스쳐를 굽는 기존의 접근 방식을 사용했을 때 필요로하는 해상도를 사용할 필요가 없습니다. 미리 계산되는 실시간 GI에서 필요로하는 라이트맵 해상도는 일반적으로 최대 2-3텍셀(telex)이며, 반대로 기존의 라이트매핑 방식으로 사용했을 때는 단위 당 20-30 텍셀이 필요합니다. 대부분의 경우, 특히 지형 같이 크기가 큰 외부 오브젝트에는, 이 값이 몇배 더 낮게 설정될 수 있습니다. 이 경우, 라이트맵 해상도는 단위 당 0.1텍셀 정도면, 충분히 세부사항을 표현할 수 있습니다.

dappling
Irradiance Budget 값을 증가시키면, 고해상도 라이트맵을 사용했을 때 발생하는 얼룩지는 현상을 줄일 수 있습니다.

고해상도 라이트맵을 사용하는 경우에는, 저해상도 라이트맵을 사용했을때는 눈에 띄지 않았던 현상이, 문제가 될 수 있다는 점에 주의해야합니다. 최종 라이트맵 텍스ㅊ에서 이런 부분이, 얼룩덜룩하게 보일 수 있습니다. 이런 현상이 발생하는 경우, 해당 라이트맵 파라미터에서 Irradiance Budget 값을 증가시키면, 이런 문제를 줄일 수 있습니다.

 

클러스터 해상도 (Cluster Resolution)

Cluster Resolution은, 미리 계산되는 실시간 GI(Precomputed Realtime GI) 라이트맵의 텍셀의 알맞는, 클러스터의 수를 나타냅니다. 예를 들어, Cluster Resolution이 최대 1로 설정되면, 해당 라이트맵의 각 텍셀마다 클러스터가 1개씩 존재하게 됩니다. Cluster Resolution 값이 0.5인 경우, 라이트맵 텍셀에 0.5개의 클러스터가 존재한다는 것을 의미합니다. 다시 말해, 클러스터는 라이트맵 크기의 두배의 크기를 갖게됩니다.

이 개념을 확장시켜서, 씬의 전체 Realtime Resolution 값을 1로 설정했다고 가정해보겠습니다. 1x1x1 크기를 갖는 큐브를 생성하고, 라이트맵 파라미터 애셋을 이 오브젝트에 할당합니다. 할당된 라이트맵 파라미터에 Resolution 항목과 Cluster Resolution 항목이 1로 설정된 경우, 큐브의 각면 마다 1개의 클러스터가 존재하게 됩니다. 그 다음 Resolution을 2로 늘리면, 큐브 한 면당 2x(1×1)개의 클러스터가 존재하게되어, 총 4개의 클러스터가 됩니다.

2x2x2
Realtime Resolution 항목이 1인 씬에 생성된 1x1x1 크기의 큐브를 보여주는 그림. 이 큐브에 할당된 라이트맵 파라미터에는 텍셀 당 1개의 클러스터가 존재하도록, Cluster Resolution 항목이 1로 설정되었습니다. 따라서 라이트맵의 해상도가 2인 경우, 각 면에 총 4개의 클러스터가 존재하게 됩니다.

대부분의 경우, Cluster Resolution은 라이트맵 텍셀 크기의 일부 정도만 필요합니다. 예를 들어, Default – HighResolution 라이트맵 파라미터 애샛에는 Cluster Resolution 항목이 0.6입니다.

클러스터의 수가 높은 씬에서는, 라이팅을 계산하는 시간이 증가하고, 런타임에서 씬의 글로벌 일루미네이션(Global Illumination)의 반응 속도가 떨어집니다. 따라서 높은 수의 클러스터를 통해서 얻는 이점이 명확한 경우에만 클러스터의 수를 늘려야합니다. 적은 수의 클러스터를 적용했음에도, 라이트맵에 별다른 문제가 없다면, 클러스터의 수를 낮추는 것을 권장합니다.

라이트맵의 해상도와 클러스터 해상도를 비율로 지정하면, 씬 전체의 Realtime Resolution 값과 상대적인 관계를 설정할 수 있습니다. Lighting 창에 정의된 Realtime Resolution을 전체 씬에서 고해상도 값으로 설정한 다음, 라이트맵 파라미터를 이용해서 개별 객체 또는 객체 그룹마다 세부적인 제어를 할 수 있습니다.

유니티는 사용자에게 더 많은 제어 기능을 제공하기 위해서, 이런 계층적인 접근 방식을 사용합니다. Resolution과 Cluster Resolution에 특정 값(절대 값)을 지정했는데 전체 라이팅 해상도를 변경하고 싶은 경우, 프로젝트에 있는 모든 라이트맵 파라미터를 직접 다시 설정해야 합니다.

 

Irradiance Budget

이 글의 앞부분에서 유니티가 클러스터를 사용해서, 씬에 있는 정적 메쉬(Geometry)의 근사치를 생성해서 미리 계산되는 실시간 GI(Precomputed Realtime GI)를 계산하는 과정에 대해서 살펴봤습니다. 라이팅을 미리 계산하는 과정에서, 이 클러스터들 사이의 관계가 계산되기 때문에, 이런 계층적인 네트워크 전체에 빠르게 빛을 전파할 수 있습니다.

본질적으로, 라이트맵 텍셀의 값은, 해당 텍셀의 위치에서 씬의 ‘뷰(view)’를 취해서 결정됩니다. 이 덕분에, 글로벌 일루미네이션(Global Illumination) 효과를 구성하기 위해서, 클러스터들 사이에서 빛이 반사되는 것을 빠르게 계산할 수 있습니다. 이 클러스터들은 최종적으로 화면에 렌더링되기 전에 라이트맵으로 샘플링 됩니다.

Irradiance Budget은 클러스터 네트워크(Cluster Network)를 샘플링할 때, 각 라이트맵 텍셀에서 사용되는 메모리의 양을 결정합니다. 이 값은 라이팅 결과의 정밀도(정확도)를 결정합니다. Irradiance Budget 값을 낮게 설정하면, 씬의 뷰를 기록할 때 각 텍셀에서 사용하는 메모리의 양이 줄어듭니다. 그 결과로, 런타임에서 메모리 사용량이 감소하고 CPU 비용도 감소하지만, 라이팅의 품질도 떨어집니다. Irradiance Budget 값을 낮게 설정하면, 라이팅 결과의 해상도가 낮아집니다(흐릿함). 이와는 반대로, Irradiance Budget 값을 높게 설정하면 더 정확한 GI 결과를 얻을 수 있지만, 런타임에서 메모리 사용량과 추가 CPU의 오버헤드가 증가하게 됩니다.

미리 계산되는 실시간 GI(Precomputed Realtime GI)가 런타임에서 갱신(업데이트)되는 속도가 충분히 빠르지 않다면(지연된다면), Irradiance Budget 값을 낮추는 것이 좋습니다. 이는 고품질의 라이팅으로 얻는 이점이 거의 눈에 띄지 않는 오브젝트 즉, 크기가 아주 크거나, 화면에서 거리가 먼 메쉬와 같은 오브젝트 등의 경우에 적합합니다.

 

Irradiance Quality

미리 계산되는 실시간 GI(Precomputed Realtime GI) 라이트맵은 라이팅을 계산하는 과정에서 생성되고, 각 라이트맵 텍셀은 씬에 ray를 발사해서, 클러스터 주변의 가시성(visibility)을 확인합니다. 그 다음에, 텍셀이 볼 수 있는 각 클러스터의 비율이 계산됩니다. 이 값은, 라이트맵의 각 텍셀에 화면에 보이는 클러스터들이 얼마나 기여하는지를 결정하는데 사용됩니다. Irradiance Quality 항목은 이 과정에서 텍셀 하나에서 사용할 수 있는 ray의 수를 지정합니다.

오브젝트가 주변의 라이팅 조건과 정확하게 일치되지 않는 경우, Irradiance Quality 항목의 값을 증가시켜보는 것이 좋습니다. 때로는 라이트맵 텍셀이 의도하지 않은 밝은 결과가 발생할 수 있습니다. 이는 씬에 발사된 ray의 수가 충분하기 않았고, 이로 인해서 라이트맵 텍셀을 가려야했던 클러스터가 누락되었기 때문입니다. 이와 유사하게, 더 밝은 색상의 클러스터가 감지되지 않았을 수도 있습니다. 이 경우의 라이트맵 결과는 의도하지 않게 어두운 색상의 결과를 나타냅니다.

씬에 발사하는 ray의 수를 증가시키면, 주변 클러스터에 대한 정확한 정보를 확인할 수 있는 가능성이 증가합니다. 하지만, 이렇게 라이트맵 출력의 정확성을 증가시키면, 라이팅을 계산하는 시간 역시 증가하게 됩니다. 라이팅 계산시간을 최적화하려면, 원하는 라이팅 결과를 얻는 한도 내에서 Irradiance Quality 값의 최소치를 사용하는 것이 좋습니다. 이 값은 런타임 성능에는 영향을 미치지 않습니다.

 

Backface Tolerance

씬 클러스터에서 라이팅 정보를 수집할때, 라이트맵 텍셀에서 발사된 ray가 메쉬의 부분 중 화면에서 보이지 않는 뒷부분에 충돌하는 경우(backface hit)가 발생할 수 있습니다. 글로벌 일루미네이션(Global Illumination)을 생성할때는, 월드 공간에서 화면에 보이는 면에서 반사되는 빛에 대해서만 고려합니다. 화면에 보이지 않는 부분에서 반사되는 빛은 유효하지 않은 정보로 간주됩니다. 이렇게 ray가 화면에 보이지 않는 부분에 충돌하는 것으로 인해서, 라이팅 결과가 손상되거나 무효처리가 될 수 있습니다. 이 경우, Backface Tolerance 값을 수정하면 이런 상황이 발생하는 것을 방지할 수 있습니다.

backfacetolerance
위 그림에서 바닥면에 어두운 라이트맵 텍셀은, 유니티의 radiocity 계산 과정에서 유효하지 않은 backface hit으로 인해서 생성되었습니다. Backface Tolerance 설정 값을 증가시키면 이 문제가 해결될 수 있습니다.

Backface Tolerance 항목은 특정 텍셀이 유효하다고 판단되기 위한, 메쉬의 정면에서 반사되는 빛의 비율을 지정합니다. 특정 라이트맵 텍셀이 이 테스트에 통과하지 못하면, 유니티는 그 주변의 텍셀을 이용해서 올바른 라이팅 결과를 추정합니다.

Backface Tolerance 항목을 수정해도 미리 계산되는 실시간 GI(Precomputed Realtime GI)의 최적화에는 영향을 미치지 않습니다. 이 값을 변경하더라도 라이팅을 계산하는 시간 및 런타임 성능에 영향을 미치지 않습니다. 하지만, Backface Tolerance 항목은 Irradiance Budget 값을 증가시켰음에도 불구하고 텍셀이 어둡거나 밝게 나타나는 등의 오류가있는 상황에서 이용할 수 있는 유용한 도구입니다.

 

Modelling Tolerance

씬에 위치한 정적 메쉬들 사이의 작은 공간이 있는 위치에서 검은 헤일로(black halo)와 같은 원하지않는 효과(인공적으로 추가된 효과)가 추가되는 경우가 있습니다. 이 문제는 특히, 대칭되는 메쉬가 근접해 있는 위치에서 자주 발생합니다.
예를 들면, 바닥면 위에 있는 물체들이 그렇습니다.

modellingtolerance
어둡게 나타나는 흐릿한 효과가 발생하는 문제는 Modelling Tolerance 값을 증가시켜서 해결할 수 있습니다.

이런 상황에서는, 오브젝트들 간의 작은 간격이 있고, 대응되는 표면에 빛이 거의 들어오지 못합니다. 따라서 라이트맵에 매우 어두운 텍셀이 기록됩니다. 낮은 해상도의 라이트맵에서 어두운 색의 텍셀은 화면에서 보이는 오브젝트의 영역을 벗어나느것을 의미하기 때문에 이렇게 원하지 않는 검은색의 흐릿한 효과가 발생할 수 있습니다. 라이팅을 처리하는 과정에서, 이런 작은 오브젝트들이 생성하는 그림자 값은 원하지 않는 값 또는 노이즈로 간주될 수 있습니다.

Modelling Tolerance 항목은 이 항목에 설정된 threahold 값 보다 작은 세부설정을 무시하는데 사용됩니다. 이 값을 증가시키면 유니티가 GI를 계산하는 과정에서, 특정 메쉬에서 다른 메쉬의 표면과 매우 인접한 부분을 무시하게 됩니다. 높을 값을 설정할수록 라이팅 계산 과정 중 Light Transport 작업에서, 이 값에 설정된 라이트맵의 비율보다 메쉬 간의 간격이 작은 값들은 제외됩니다. Modeling Tolerance 값을 감소시키면, GI 계산과정에서 처리되도록 설정할 수 있습니다.

Modeling Tolerance는 미리 계산되는 실시간 GI(Precomputed Realtime GI)의 최적화에는 영향을 미치지 않습니다. 라이팅을 계산하는 과정이나 런타임에서 부정적인 영향을 미치지 않습니다. 하지만, 원하지 않은 시각적 효과(문제)가 발생했을때 해결책으로 사용할 수 있습니다. Modelling Tolerance는 Irradiance Budget 값이나 Irradiance Quality 등의 값을 증가시켰는데도 문제가 계속되는 경우에 유용하게 사용될 수 있습니다.

 

 

라이트맵 파라미터 애샛 생성하기 (Building our Lightmap Parameters assets)

지금까지 다양한 라이트맵 파라미터 설정항목들을 기능적인 관점에서 살펴봤습니다. 이제 라이트맵 파라미터 애샛을 생성하고 튜토리얼 씬에 지금까지 배운 지식을 적용할 차례입니다.

  • LightingTutorialStart 씬을 엽니다.
  • 프로젝트 뷰에서 Assets > LightmapParameters 폴더를 찾습니다.
  • 프로젝트 뷰의 왼쪽 상단에 있는 메뉴에서 Create > Lightmap Parameters 메뉴를 선택합니다.
  • 새로 생성된 라이트맵 파라미터 애샛의 이름을 TutorialTerrainLow라고 지정합니다.

 

verylargeobjects
게임오브젝트의 크기가 아주 크고 카메라에서 멀리 떨어져 있기때문에, 씬에 설정된 기본 값을 사용하기 보다는 라이트맵 파라미터를 적용하는 것이 좋습니다.

그 다음, 씬에 있는 오브젝트에 라이트맵 파라미터 애샛을 할당합니다.

  • 씬 뷰에서 플레이 가능한 지역에 가까이 위치한, 두 개의 산(Mountain) 게임 오브젝트를 선택합니다. 이 두 게임오브젝트는 모두 MountainPeak이라고 이름이 지정되어 있습니다. 가장 멀리 위치한 산은 무시한다(생략한다)는 점에 주의합니다.
  • 인스펙터 뷰를 이용해서, MountainPeak 게임오브젝트가 모두 Static으로 플래그를 설정합니다. Static 체크박스를 체크했는지 확인합니다.
  • Lighting 창(Window > Lighting)을 열고 Scene 탭을 선택합니다.
  • Auto 모드가 활성화되었는지 확인합니다. Auto라고 표시된 체크박스를 체크하면 Auto 모드가 활성화됩니다.
  • 이제 Object 탭을 선택합니다.
  • Advanced Parameters 드롭-다운 메뉴에서, 새로 생성된 TutorialTerrainLow 라이트맵 파라미터 애샛을 선택합니다. 이렇게하면, 라이트맵 파라미터 애샛이 선택된 게임오브젝트에 할당됩니다.
  • Advanced Parameters 드롭-다운 메뉴의 오른쪽에 위치한 Edit 버튼을 클릭해서 설정 변경을 시작합니다.

 

newlightmapparam_0
라이트맵 파라미터 애샛을 생성했을 때의 기본 설정 모습.

첫번째로 보이는 파라미터는 Resolution 입니다. 라이트맵의 해상도를 줄이면, 라이팅을 계산하는데 걸리는 시간과 런타임 성능을 모두 향상시킬 수 있습니다. 따라서 라이팅 품질에 영향을 주지 않는 선에서 가장 작은 해상도 값을 사용하는 것을 목표로 하는 것이 좋습니다.

높은 해상도의 라이트맵은 카메라에서 아주 가까운 위치에 있는 오브젝트에 적합합니다. 하지만, MountainPeak 게임오브젝트는 모두 카메라에서 상대적으로 먼 거리에 위치해 있습니다. 그 외의 다른 요소들 역시, 낮은 해상도의 라이트맵을 사용하는 것이 적합하나는 것을 알려줍니다. 이렇게 크기가 큰 오브젝트는 일반적으로 해당 재질(Material)의 알베도(Albedo) 값이 상당히 일정합니다. 또한, 카메라의 관점에서 보면, 이러한 물체로부터 전달되는 빛의 색에는 차이가 거의 없습니다. 추가적으로 포착할 세부사항이 없으면 결과의 품질에 영향을 주지 않는 선에서 이 오브젝트들의 라이트맵 해상도를 낮춥니다.

highreslarge
산이나 지형과 같은 크기가 큰 풍경 오브젝트의 경우, 기본 라이트맵 해상도는 낭비일 수 있습니다.

highreslow
라이팅 결과의 품질에서 손상되는 부분이 아주 작은 선에서, 낮은 해상도를 사용하면 라이팅을 계산하는 과정과 런타임 성능 모두를 절약할 수 있습니다.

  • TutorialTerrainLow 라이트맵 파라미터 애샛의 Resolution 파라미터 값을 천천히 줄여가면서 씬뷰에서 라이트맵 해상도의 변화를 살펴봅니다.

Resolution 값은, 씬 전체적으로 적용되는 Realtime Resolution(Lighting 창의 Scene 탭에 정의되어 있습니다)에 곱해지는 값이라는 것을 명심합니다. 예제 씬에서는 Realtime Resolution 값을 1로 설정했습니다. 따라서, 라이트맵 파라미터에서 Resolution 값을 1보다 작은 값으로 설정하면, 라이트맵은 출력 결과는 단위 크기당 1텍셀보다 작은 크기를 갖게됩니다.

MountainPeak 오브젝트들은 다른 씬 메쉬들로부터 멀리 떨어져있기 때문에, 세부적이거나 고주파의 빛을 받지 못할 가능성이 높습니다. 다시 말해, 낮은 해상도를 사용하더라도 시각적으로 손실을 보는 정도가 매우 작다는 의미입니다. 예제 씬에서는, 이 오브젝트들에 의해서 반사되는 디퓨즈 라이팅(diffuse lighting)을 포착하는데 0.05의 Resolution값이면 충분하다는 것을 확인했습니다. 이 값을 새로 생성된 TutorialTerrainLow 라이트맵 파라미터에 입력합니다.

  • 프로젝트 뷰에서 TutorialTerrainLow 라이트맵 파라미터 애샛을 선택합니다.
  • 인스펙터 뷰에서 Resolution 항목에 0.05 값을 설정합니다.

그 다음으로, Cluster Resolution 값을 살펴봅니다. 위에서 설명했듯이, Cluster Resolution은 해당 오브젝트를 위해서 생성된 모든 라이트맵의 텍셀크기에 곱해지는 값입니다. 값을 1로 설정하면, 라이트맵 텍셀의 크기와 단일 클러스터의 크기가 같아집니다. 낮은 값을 설정하면 라이트맵 텍셀이 여러 개로 나뉘게 됩니다. 클러스터는 본질적으로, 유니티의 미리계산되는 실시간 GI(Precomputed Realtime GI)에 사용되는 정적 씬(Static Scene)의 복셀화된(Voxelized) 근사치라는 것을 명심합니다. 즉, 해당 오브젝트로부터 반사되거나 해당 오브젝트로 반사되는 빛의 색의 변화를 포착하는데, 이러한 복셀의 크기가 충분하지 않은 경우에만, 높은 클러스터 해상도를 고려해볼 필요가 있습니다.

라이트맵의 해상도와 마찬가지로, MountainPeak 게임 오브젝트에 사용되는 Cluster Resolution는 작은 값을 설정할 수 있습니다. 씬의 나머지 오브젝트에서 요구되는 클러스터 해상도의 기본 값은 이 크기의 오브젝트를 처리하는데 수백개의 클러스터가 필요하다는 것을 의미합니다.

MountainPeak 게임오브젝트가 상당히 일정한 알베도(Albedo)색상을 가지는 재질을 사용하고, 카메라로부터 멀리 떨어져 있다고 가정하면, 이 오브젝트의 해상도를 선택적으로 줄여서 성능을 절약할 수 있습니다. 높은 해상도를 사용했을때와 라이팅 솔루션의 정확도가 같지는 않지만, 시각적인 차이는 거의 느끼지 못합니다.

clusterresolutiondraw

  • 크기가 크고, 카메라로부터 멀리 떨어진 오브젝트에는 Cluster Resolution 값에 상당히 낮은 값을 설정할 수 있습니다.
  • 씬뷰 왼쪽 상단에 있는 Draw Mode 드롭-다운 메뉴를 이용해서 Clustering 메뉴를 선택합니다.
  • 프로젝트 뷰에서 TutorialTerrainLow 라이트맵 파라미터 애샛을 선택합니다.
  • 인스펙터뷰에서 Cluster Resolution 값을 낮춥니다. 값이 감소하면서 색으로 표현된 패치(patch)의 크기가 얼마나 커지는지 살펴봅니다.

Clustering Draw 모드 와는 다른 방법으로, Lit Clustering Draw 모드는, 클러스터 근사값의 결과가 씬에 설정된 라이팅(조명)을 세부적으로 포착(캡쳐)하기에 충분한지 여부를 평가하는 유용한 방법입니다.

  • 씬뷰의 왼쪽 상단에서 Draw Mode 드롭-다운 메뉴를 이용해서 Lit Clustering 메뉴를 선택합니다.
  • 프로젝트 뷰에서 TutorialTerrainLow 라이트맵 파라미터 애샛을 선택합니다.
  • 인스펙터뷰에서 Cluster Resolution 값을 낮춥니다. 값이 변하면서 화면이 어떻게 변하는지를 살펴봅니다.

이 값을 조절할때, 낮은 클러스터 해상도(Cluster Resolution)를 사용함으로써 라이팅에서 중요한 부분이 빠지지 않았는지를 확인하는 것이 좋습니다. 높은 해상도를 사용했을때 시각적인 이점이 없는 경우에는 항상, 더 적은 수의 클러스터를 사용하는 것을 권장합니다. 씬 내의 클러스터의 수는 라이팅을 계산하는 시간과 런타임에서 GI의 성능 모두에 영향을 미치기 때문입니다. 예제에서는, Cluster Resolution 값에 0.4를 설정했을때 MountainPeak 게임오브젝트 인스턴스에 적합하다는 것을 발견했습니다.

  • 프로젝트 뷰에서 TutorialTerrainLow 라이트맵 파라미터 애샛을 선택합니다.
  • 인스펙터뷰에서 Cluster Resolution 항목에 0.4를 입력합니다.

litclusteringdraw
Lit Clustering Scene Draw 모드는, Cluster Resolution이 씬에 위치한 라이팅(조명)을 세부적으로 포착하기에 충분한지를 평가할때 매우 유용합니다.

대부분의 경우, 라이트맵의 해상도와 클러스터의 크기를 줄임으로써 라이팅 성능을 크게 향상시킬 수 있습니다. 그리고, 유니티의 radiosity 계산 과정에서 사용되는 값(Irradiance Budget 과 Irradiance Quality)들을 조절해서 성능을 좀 더 세밀하게 개선할 수도 있습니다.

첫째로 Irradiance Budget 항목을 살펴보겠습니다. 앞에서 설명했듯이, 이 값은 해당 값이 계산될때, 라이트맵 텍셀마다 할당되는 메모리의 양을 결정합니다. 런타임 성능 측면에서는, 라이팅(조명)에 결과에 부정적인 효과를 미치게하지 않는 선에서, Irradiance Budget 항목의 최소값을 사용하는 것이 좋습니다.

미리 계산되는 실시간 GI(Precomputed Realtime GI)가 너무 부드럽게 보이거나 부정확하게 보이는 경우에는 Irradiance Budget 값을 늘릴 수 있습니다. 이런 현상은 특히, 씬에서 고 대비 라이팅(high contrast lighting)이 정확하게 표현되지 않는 영역에서 나타날 수 있습니다.

irradiancemountain
Irradiance Scene Draw 모드는 Irradiance Budget 또는 Irradiance Quality 값에 변화에 따른 결과를 확인할 때 매우 유용합니다.

두 개의 MountainPeak 게임오브젝트의 경우, 이 게임오브젝트에 적용되는 빛은 주로 저주파입니다. 따라서 얼룩덜룩하게 보이는 라이팅이나 고 대비 라이팅(high contrast lighting)을 포착(캡쳐)할 필요가 없습니다. 즉, 라이팅에 부정적인 영향을 미치지 않으면서, Irradiance Budget 항목을 기본값인 128바이트(Bytes)에서 줄일 수 있습니다.

  • 씬뷰의 왼쪽 상단에서 Draw Mode 드롭-다운 메뉴를 이용해서 Irradiance 메뉴를 선택합니다.
  • 프로젝트 뷰에서 TutorialTerrainLow 라이트맵 파라미터 애샛을 선택합니다.
  • 인스펙터 뷰에서 Irradiance Budget 항목의 값을 줄입니다.
  • 값이 감소하면서, MountainPeak 게임오브젝트에 적용되는 라이팅이 얼마나 부드럽게 변화하는지 살펴봅니다.

몇가지 실험을 통해서, Irradiance Budget 값을 원래 값에 절반인 64바이트까지 줄여도 라이팅에 큰 영향을 주지 않는 것을 확인했습니다.

  • 프로젝트 뷰에서 TutorialTerrainLow 라이트맵 파라미터 애샛을 선택합니다.
  • 인스펙터 뷰에서 Irradiance Budget 항목에 64를 설정합니다.

이제, Irradiance Quality 항목을 살펴보겠습니다. 위에서 설명했듯이, Irradiance Quality 항목은 라이트맵 텍셀의 값을 계산할때 각 클러스터에서 방출(발사)하는 Ray의 수를 결정합니다. 런타임 성능에 영향을 미치는 Irradiance Budget과는 달리, Irradiance Quality 항목은 라이팅을 계산하는 시간에만 영향을 미칩니다.

방출(발사)되는 Ray의 수가 적은 이유로 인해서, 크기가 작지만 중요한 클러스터의 처리가 생략되는 경우가 발생하는 상황에서는 Irradiance Quality 항목의 값을 증가시키는 것이 유용할 수 있습니다. 예를 들어, 메쉬의 특정 부분에서 두드러지는 색상이 있는데, 라이트맵 결과에서는 해당 색상이 표현되지 않은 경우를 예로들 수 있습니다.

MountainPeak 게임오브젝트와 같이, 씬에서 크기가 아주 큰 오브젝트는 근처의 클러스터가 누락되는 경우가 발생할 확률이 매우 낮습니다. 따라서, 라이팅 결과에는 부정적인 영향을 미치지 않으면서, Irradiance Quality 항목의 값을 낮춰서 라이팅을 계산과정의 성능을 향상시킬 수 있습니다.

  • 씬뷰의 왼쪽 상단에서 Draw Mode 드롭-다운 메뉴를 이용해서 Irradiance 메뉴를 선택합니다.
  • 프로젝트 뷰에서 TutorialTerrainLow 라이트맵 파라미터 애샛을 선택합니다.
  • 인스펙터 뷰에서 Irradiance Quality 항목의 값을 줄입니다.
  • 값이 감소하면서 라이트맵의 결과가 조금씩 덜 뚜렷하게 보이는 정도를 확인합니다.

여러 결과를 테스트 해본 결과, Irradiance Quality 값에 2048을 설정하는 것이, GI 라이팅과 라이팅 계산시간 사이에서 적당하다는 것을 확인했습니다. 정확도가 다소 줄어들었지만, 두 오브젝트가 멀리 위치해 있기 떄문에 이에 대한 라이팅 효과로 충분합니다.

  • 프로젝트 뷰에서 TutorialTerrainLow 라이트맵 파라미터 애샛을 선택합니다.
  • 인스펙터 뷰에서 Irradiance Quality 항목에 2048를 설정합니다.

 

 

씬에 라이트맵 파라미터 애샛 할당하기 (Assigning Lightmap Parameters assets throughout the Scene)

라이트맵 파라미터 애샛을 조절해서 멀리 위치한 배경에 대한 설정을 마쳤습니다. 이제 배운 내용을 토대로 LightingTutorialStart 씬의 나머지 정적 메쉬에 라이트맵 파라미터 애샛을 생성하고 적용해볼 차례입니다.

이 글의 앞부분에서 씬에서 오브젝트를 구성하기 위해서 분류(taxonomy) 또는 체계(scheme)를 결정하는 것이 좋은 방법인지에 대해서 논의했습니다. 씬을 오브젝트 그룹 단위로 나눌때, 오브젝트의 크기나 카메라와의 거리 등과 같은 특징을 기반으로 나누면 라이트맵 파라미터 애샛을 적용해서 라이팅 성능을 조절할때 좀 더 쉽게 선택할 수 있습니다.

Environment 게임오브젝트의 아래 계층에 위치한 나머지 정적 오브젝트를 작업하면서, 라이트맵 파라미터 애샛을 공유할 수 있는 오브젝트의 분류를 찾습니다. 예를 들어, 오브젝트가 플레이 가능한 지역과 가까이 위치해 있는지, 카메라에 가까이 보이는지 등을 살펴봅니다. 이 경우, 이 오브젝트에 대한 Resolution 값을 증가시키면 라이팅 결과가 뚜렷하게 향상되는 것을 확인할 수 있습니다. 또, 오브젝트가 카메라에서 멀리 위치해 있거나 부분적으로 다른 오브젝트에 의해서 가려졌는지 확인합니다. 이 경우, 시각적으로 얻는 이점이 뚜렷하지 않기 때문에, 동일한 Resolution 값을 사용할 필요가 없습니다. 이와 비슷하게, 오브젝트 재질(Material)의 알베도(Albedo) 값에 큰 변화가 없는 경우에는, 높은 해상도를 적용하더라도 이를 통해서 얻는 이점이 크지 않을 수 있습니다.

라이트맵 파라미터 애샛을 할당할때 너무 세분화할 필요는 없습니다. 대부분에 씬에서 몇개 정도면 충분합니다. 설정을 조금씩 변경해서 다수의 라이트맵 파라미터 애샛을 생성하는 것은, 서로 다른 라이트맵 파라미터 애샛에 변경사항을 여러번 적용해봐야 하기 때문에 작업이 어렵습니다.

완성된 튜토리얼 씬인 LightingTutorialOptimal에서는, 오브젝트의 복잡도와 필요한 해상도를 기반으로 씬을 다음과 같은 범주(카테고리)로 나눴습니다:

  • RocksLow: 카메라에서 멀리떨어져 있는 매끄럽고, 볼록한 바위 모양의 메쉬. 거리가 멀리 떨어져 있기 때문에, Resolution과 Cluster Resolution 항목에 낮은 값을 사용합니다.
  • RocksMedium: 매끄럽고, 볼록한 바위 모양의 메쉬이지만, 플레이할 수 있는 영역과 카메라에 좀 더 가까이 위치해서 눈에 더 잘 띄는 메쉬. 이런 이유로, Irradiance Budget과 Irradiance Quality 값에 좀 더 높은 값을 설정하고, Resolution과 Cluster Resolution 항목에도 좀 더 높은 값을 사용합니다.
  • StructuresHigh: Resolution 과 Cluster Resolution에 높은 값을 설정했을때 시각적인 효과를 향상시킬 수 있는 중요한 건물(빌딩). 따라서 Irradiance Quality와 Irradiance Budget 항목에 더 큰 값이 필요합니다.
  • StructuresLow: 낮은 해상도 값의 적용이 필요한, 카메라에서 멀리 떨어진 빌딩.
  • TerrainLow: 고 해상도의 라이팅을 적용해도 시각적으로 얻는 이득이 크지 않은, 산과 같은 크기가 크고 카메라와의 거리가 먼 메쉬.
  • TerrainPlayable: 카메라에 가까이 위치해 있기 때문에, 더 정밀한 테스트를 위해서 라이트맵 해상도의 균형을 잡아야하는 크기가 큰 지형 오브젝트. 오브젝트의 크기가 크기 때문에 Cluster Resolution 항목에 낮은 값을 사용할 수 있습니다.
  • TerrainVeryLow: Resolution 과 Cluster Resolution 항목에 낮은 값을 사용하는 것이 좋은, 거리가 멀리 위치해있고, 부분적으로 가려져있는 오브젝트. 이 오브젝트에는, Irradiance Quality 와 Irradiance Budget 값 역시 낮게 설정했습니다.

커스텀 라이트맵 파라미터 애샛 외에도, 완성된 예제 씬 LightingTutorialOptimal에는 Lighting 창의 Scene 탭에 설정된 기본 파라미터 값을 사용하는 여러 오브젝트가 있습니다. 이 오브젝트에는 유니티의 표준 라이트맵 파라미터인 Lightmap Parameters Default-Medium을 사용합니다.

씬 내의 대부분의 정적 오브젝트에 기본 파라미터를 사용하면, 수동으로 직접 할당해야하는 작업의 양을 줄일 수 있습니다. 다수의 오브젝트에서 사용할 기본 파라미터를 설정하는 것이 좋습니다. 예제에서는, 기본 단위 크기(unit)당 1 텍셀의 Realtime Resolution 값과 함께 Default-Medium 파라미터를 적용해서, 씬에 있는 대부분의 오브젝트에 최적의 결과를 얻을 수 있었습니다.

irradiancedraw
Irradiance Scene Draw 모드는, 미리 계산되는 실시간 GI(Precomputed Realtime GI)에 영향을 미치지 않는 재질(Material)이나 non-Static 오브젝트에 문제를 일으키지 않고 씬 라이팅의 결과를 보여주기 때문에 매우 유용합니다.

씬에 빛(라이팅)을 할당 및 구성할때 LightingTutorialOptimal 씬을 참고하시기 바랍니다. 씬에 있는 나머지 정적 오브젝트에 라이트맵 파라미터를 할당하는데 시간이 그렇게 오래 걸리지 않습니다. 이렇게 나머지 오브젝트에 작업을 할때는 항상, 설정 값을 높게 유지하는 것이 객관적으로 이점이 있는지 확인하는 것이 좋습니다. 시각적으로 부정적인 영향이 없다면, 설정 값을 낮추는 것이 좋습니다.

 

내용 끝까지 읽어주셔서 감사합니다.

배너 클릭은 저에게 많은 힘이 됩니다.

감사합니다 🙂

 

다음글 – Summary – Precomputed Realtime GI

RonnieJ

프리랜서 IT강사로 활동하고 있습니다. 게임 개발, 웹 개발, 1인 기업, 독서, 책쓰기에 관심이 많습니다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다