Unwrapping and Chart reduction – 번역

Unwrapping and Chart reduction

원문 링크

 

이전글 – Probe lighting

Unwrapping and Chart reduction

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

 

라이팅을 미리 계산하는 프로세스(precompute process)에서, 적합한 오브젝트를 제외시켰기 때문에, 이제 남은 챠트(Chart)의 수를 줄이는 작업을 시작할 수 있습니다.

챠트는 정적 메쉬렌더러(Static MeshRenderer)의 UV 라이트맵 좌표를 포함시키기 위해서 생성됩니다. 오브젝트에서 요구하는 챠트의 수는, 해당 오브젝트에서 unwrap 작업을 하기 위해서 필요한 UV 조각의 수에 의해서 결정됩니다. Unwrapping 작업은 모델링 표면에 분포된 텍셀의 왜곡과 텍스쳐를 충분히 표현하기 위해서 필요한 쉘(shell)의 수 사이에서 균형을 유지해야하는 과정입니다.

유니티의 복잡한 unwrapping 알고리즘은 사용자의 개입이 없어도 좋은 결과를 낼 수도 있습니다; 하지만, 종종 약간의 설정을 해야하는 경우가 있습니다. 따라서, 자동 unwrapping 프로세스의 개념과 처리 과정을 이해하는 것이 중요합니다.

아래 그림을 살펴보겠습니다:

unwrap01
왜곡은 없지만, 다수의 UV 쉘(shell)을 필요로하는 unwrap.

unwrap02
단일 UV 쉘(shell)이지만, 허용하기 힘든 텍스쳐 왜곡이 발생한 UV 좌표.

unwrap03
텍스쳐 왜곡도 없고, 단일 UV 쉘만 사용한 이상적인 결과.

위의 이미지에서 오브젝트의 UV 투영 및 unwrap 방법에 대한 3가지 다른 예를 살펴봤습니다.

첫번째 이미지는 왜곡이 거의 없는 결과를 보여줍니다. 예제에서 텍스쳐로 사용한 체크 패턴은, 텍스쳐의 각 타일이 정사각형 모양으로 남아있는 방식으로 매핑되었습니다. 이 체크무늬 텍스쳐를 라이트맵(오브젝트에 적용된 라이팅의 ‘이미지’)이라고 가정하면, 시각적으로 정확하고 왜곡이 없는 결과를 얻은 것처럼 보입니다. 하지만, 이 텍스쳐를 처리하기 위해서는 6개의 UV 쉘이 필요합니다. 그 결과로, 유니티의 미리 계산된 실시간 GI(Precomputed Realtime GI) 시스템을 사용하는 6개의 챠트(Chart)가 생성됩니다. 오브젝트 크기에 관계없이, 각 챠트는 최소 4×4 크기의 텍셀을 필요로하기 때문에, 이 오브젝트는 해상도와 관계없이 적어도 96 텍셀을 사용하게 됩니다.

두번째 이미지에서는 다른 문제가 발생했습니다. 오브젝트의 UV 텍스쳐 좌표의 투영을 통해서, 모든 면을 감싸는 단일 UV를 생성했습니다. 오브젝트를 감싸는데 필요한 챠트의 수 관점에서는 최적화된 반면, 시각적인 결과는 허용할 수 없는 수준으로 왜곡되었습니다. 오브젝트 표면에 걸쳐서 적용된 텍스쳐가 ‘삐뚤어진 것’을 쉽게 볼 수 있습니다. 또한 오브젝트의 각 표면은 UV 텍스쳐 공간(UV Texture Space)에서 겹칩니다 – 즉, 이 라이트맵을 참조하면, 오브젝트의 한면에 적용된 빛이 반대편 면에서도 표시됩니다. 분명히, 오브젝트를 unwrapping 할때, 이 방법으로는 허용할 수 있는 결과를 만들어내지 못합니다.

세번째 이미지는 이상적인 unwrap의 예를 보여줍니다. 이 예제에서 왜곡이 없는 결과를 얻었습니다; 체크 무늬 텍스쳐의 타일(tiles)은 정사각형 모양으로 남아있습니다. 또한, UV 쉘을 하나만 생성하고도 오브젝트의 모든 면을 감싸는데 성공했습니다. 모델링에서 연속되는 에지에 해당하는 UV 에지(edge)를 결합하거나, 붙히는 방법을 통해서 이 결과를 얻을 수 있었습니다.

이 내용을 프로그래밍 적으로 생각해볼때, 이상적인 unwrap을 위해서 어떤 작업이 필요했을까요? 첫째, 개별 쉘(shell)을 생성하기 위해서 UV 투영을 오브젝트에 직각으로 했습니다. 그 다음, 해당 오브젝트의 모델링 구조에서 서로 공유되는 에지(edge)를 확인했습니다. 다른 에지와 공유하는 에지(edge)가 발견되면, 이 에지(edge)를 인접 쉘의 에지(Edge)에 이동시키고, 결합시켰습니다. 이 방식이 바로 유니티의 unwrapping 알로리즘에서, 정적 메쉬(Static Geometry)에 대해서 자동으로 처리하려는 방식입니다.

 

챠트 시각화하기 (Visualizing Charts)

Unwrapping 및 라이트맵 챠트(lightmap chart)를 최적화시키기 전에, 에디터에서 이들을 시각화해서 확인해야 합니다. 챠트는 메쉬 임포트 파이프라인의 unwrapping 단계에서 생성됩니다. 미리 계산된 실시간 GI(Precomputed Realtime GI)에서, 이 챠트는 라이팅 계산 프로세스의 Geometry 단계에서 아틀라스(Atlas)로 패킹됩니다. 이 과정에서 서로 겹치지 않도록 해야합니다. 라이팅을 계산하는 과정의 Geometry 단계가 완료되고, 시각화 데이터의 저장이 완료되어야 챠트의 미리보기가 가능합니다.

개발팀에서 버전관리 시스템을 사용하는 경우에는, 이 정보가 로컬에 캐시된다는 점에 주의해야 합니다. 즉, 다양한 진단 Draw 모드(챠트 미리보기 등)가 사용가능하려면 먼저, 로컬 장치에서 라이팅을 계산하는 과정을 수행해야 합니다.

charting
씬에서 사용되는 서로 다른 챠트(색상 영역으로 표시됨) 및 체크 무늬 오버레이로 라이트맵 해상도를 나타내는 UV Charts Draw 모드.

챠트를 시각화시키는 빠른 방법 중 하나는 씬 뷰에서 UV Charts draw 모드를 사용하는 것입니다.

  • 씬 뷰의 왼쪽 상단에서 Draw Mode 드롭다운 메뉴를 선택하고 UV Charts 메뉴를 선택합니다.

이 모드를 사용하면, 해당하는 라이트맵 해상도를 나타내는 체크 무늬 텍스쳐와 함께 서로 다른 색상 패널이 겹쳐진 챠트(Chart)의 모습을 확인할 수 있습니다. Auto 모드가 활성화되어 있는 경우(Window > Lighting > Auto), unwrap 파라미터를 변경하면 라이팅이 자동으로 계산되며 이 과정이 완료된 후 계산된 결과가 반영되어 씬의 모습이 갱신됩니다.

preview
챠트는 색이 칠해진 정사각형으로 나타나고 라이트맵 UV는 파란색 와이어프레임(wireframe)으로 나타나는, 오브젝트 미리보기 창의 Chart 모드.

복잡한 오브젝트로 작업을 할때는 챠트(Chart)를 놓치기 쉽습니다. Lighting Window의 미리보기 창을 이용하면, 개별 오브젝트에서 사용하는 모든 챠트를 확인할 수 있습니다. 이를 활용하면, 좀 더 정확하게 오브젝트의 unwrapping 결과를 평가할 수 있고, 결과적으로 씬에 생성된 챠트의 수를 줄이는데 도움이 됩니다.

  • Lighting 창(Window > Lighting)을 열고 Object 탭을 선택합니다.
  • 계층 뷰에서 확인하려는 오브젝트를 선택합니다.
  • Lighting Window의 미리보기 창의 왼쪽 상단에서, 드롭다운 메뉴를 선택한 다음 Charting 메뉴를 선택합니다.

선택한 오브젝트에서 사용하는 챠트의 수는, 색이 칠해진 정사각형으로 표현되며, 이 정사각형은 파란색으로 표시되는 해당 UV 좌표와 겹쳐서 나타납니다.
Unwrapping 설정항목 설명 (Unwrapping parameters explained)

UV unwrapping 과정을 최적화할때 조절할 수 있는 몇가지 설정항목이 있습니다. 이런 설정항목은 모두 오브젝트-당 설정항목입니다(각 오브젝트마다 개별 설정항목을 갖습니다). 이 설정항목들은 아래와 같이, Lighting 창을 통해서 접근 가능합니다:

  • Lighting 창(Window > Lighting)을 열고 Object 탭을 선택합니다.
  • 계층 뷰에서 확인하려는 오브젝트를 선택합니다.

 

 

Auto UV Max Distance

유니티의 unwrapping 알고리즘은 UV 쉘(shell)의 이동과 UV 에지(Edge)를 결합시키는 방식을 통해서, 라이트맵 UV를 단순화하는 형태로 동작합니다. Auto UV Max Distance에 정의된 거리내에 해당 쉘이 위치한 경우에만, UV 쉘로 간주됩니다. 이 항목에 설정되는 값의 범위는 유니티의 월드 공간의 단위(World Space Unit)에 의해서 정의됩니다. 이 글에서 진행하는 예제는 해당 단위를 1미터로 가정한다는 점을 명심하시기 바랍니다.

maxdistance
Lighting 창의 Object 탭에서 확인할 수 있는 Auto Uv Max Distance 설정항목.

많은 경우에서, 기본값인 0.5로 설정하면 허용할만한 수준의 결과를 얻을 수 있습니다. 크기가 큰 표면(Face)을 가진 큰 오브젝트에는, 이 값을 늘려야할 필요가 있습니다. 이는 UV를 결합하는 알고리즘에 의해서, 사용해야하는 UV가 잘못 선택되어 제거되는 것을 방지하려는 목적이 있습니다.

Auto UV Max Distance 값을 증가시키면, 선택된 오브젝트에서 필요로하는 챠트의 수를 감소시킬 수 있습니다. 라이트맵 텍셀(lightmap texel)이 시각적으로 늘어지거나 필요한 텍셀을 충분히 감싸기위해서 의도적으로 더 많은 챠트를 사용해야하는 경우, 이 값을 감소시키는 것이 유용합니다. 이 값의 변경으로인한 결과는 UV Chart 모드(씬 Draw 모드에서 선택)에서 체크 모양의 오버레이(overlay)를 이용해서 쉽게 확인할 수 있습니다. 적절한 값을 찾기까지는 테스트가 필요할 수 있습니다.

 

Auto UV Max Angle

또한, 라이팅 UV 쉘(Lighting UV shell)은 해당 메쉬의 인접 면 사이의 각도를 기반으로 결합여부가 평가됩니다. Auto UV Max Angle는 UV 에지(Edge)를 공유하는 면(Face) 사이에 허용되는 최대 각도를 정의하며, 면 사이의 내부 각도를 이용해서 계산됩니다. 뒷면(backfaces) 사이의 각도가 이 값보다 큰 경우, 결합과정(Stitching)에서 이런 UV 쉘(Shell)은 고려되지 않습니다.

maxangle
Lighting 창의 Object 탭에서 확인할 수 있는 Auto Max Angle 설정항목.

이 값을 증가시키면, 유니티의 unwrapping 알고리즘에 의해서 라이팅 UV가 결합될 확률이 높아집니다. Auto UV Max Angle은 선택된 오브젝트에서 필요한 챠트의 수를 감소시키는데 좋은 방법입니다. 하지만, 이 값을 너무 높게 설정하면, 종종 라이트맵의 늘어짐 현상이 발생합니다. Auto UV Max Angle 값을 낮추면, unwrapper에서 UV 에지(Edge)를 결합할 확률이 낮아지기 때문에 챠트의 수가 늘어나는 반면, 왜곡은 줄어듭니다. Auto UV Max Angle 항목에 사용하기 적합한 값을 찾는데, UV Chart 모드(씬 Draw 모드에서 선택)에서 체크 모양의 오버레이(overlay)를 활용하는 것이 좋습니다.

 

Preserve UVs

자동 unwrapper를 이용해서 이상적인 unwrap 결과를 얻는 것이 불가능한 경우가 있습니다. 이런 상황에서 자동 unwrapper를 사용하면, 너무 많은 수의 챠트 또는 라이트맵에서 허용할 수 없는 수준의 왜곡(GI Chart Draw 모드에서 체크 무늬가 늘어남)이 발생할 수 있습니다. 이런 경우, 모델 파일의 UV01에 수동으로 UV를 생성해야할 필요가 있습니다. 이 작업은 선택한 콘텐츠의 생성(content creation package) 과정에서 진행해야하는 작업입니다.

이 경우, Preserve UVs 옵션을 이용해서 유니티의 unwrapping 알고리즘에서, 해당 모델의 UV01에 정의된 UV 쉘(Shell)의 모양을 유지하도록 할 수 있습니다.

preserveuvs
수동으로 라이팅 UV를 보존해야하는 경우에 유용한 Preserve UVs 옵션.

이러한 쉘(shell)은 라이트맵 공간을 절약하기 위해서 다시 패킹(repack)된다는 점을 주의해야 합니다. 이 방법은 라이트맵에 있는 쉘의 위치 보다는, 쉘을 unwrap 처리해서 개별적으로 보관하는 방식입니다.

이 접근 방법을 사용할때는 주의를 해야합니다. 라이트맵 UV가 UV 쉘을 다수 포함하고있는 경우, 이 옵션을 사용하면 라이팅을 미리 계산하는 시간을 증가시킬 수 있습니다. 이러한 이유는 유니티의 자동 unwrapper에서 제공하는 UV 벼합 단계를 우회해서 수동으로 설정한 UV 레이아웃(layout)을 보존되기 떄문입니다. 언제나 명심해야하는 것은, 허용할 수 있는 수준의 왜곡 정도를 유지하면서, UV 쉘(shell)의 수를 가능한 줄이는 것입니다. 이렇게 하면, 결과적으로 챠트(Chart)의 수도 줄어듭니다.

 

 

Ignore Normals

특정한 경우에 메쉬 임포터에서 모델링 구조를 분리하도록 결정하는 경우가 있습니다. 이런 경우에는 챠트에도 영향을 미치게 됩니다. 예를 들어, 해당 메쉬의 삼각면(triangle)의 수가 아주 많은 경우에 유니티에서 해당 메쉬를 여러 서브-메쉬로 분리하는 것이 더 효율적일 수 있습니다. 종종 이 방법은 매 드로우 콜(Draw Call)마다 삼각면의 수를 줄이기 위한 목적으로, 하드웨어에서 필요로하는 경우가 있습니다. 하드 에지(hard edge)와 같이, 메쉬에서 인접한 면 사이의 노멀(normal) 각도 차가 큰 영역을 기반으로, 메쉬의 분리 위치를 결정합니다. 이런 방식의 메쉬 분리는 모델링의 메쉬 임포트 프로세스에서 처리됩니다. 이 프로세스 과정에서, 챠트에 포함된 에지(edge)가 분리되면서, 잠재적으로 해당 챠트 역시 분리될 수 있습니다. 이로인해서 결과적으로 챠트의 수가 늘어날 수 있습니다.

ignorenormals
Ignore Normals 체크박스는 임포트 파이프라인에서 챠트가 분리되는 것을 방지합니다.

이런 방식으로 챠트를 분리하기를 원하지않는 경우가 있습니다. 챠트가 분리되면 라이팅을 계산하는 시간에 치명적일 수 있는, 챠트의 수 증가로 연결됩니다. 또한, 결과로 생성된 라이트맵에서 라이팅의 경계선에 원하지않는 시각적인 오류가 발생할 수 있습니다. 이런 경우, Ignore Normals 체크박스를 활성화하면 미리 계산되는 실시간 GI(Precomputed Realtime GI) 라이팅을 위해서 챠트(Chart)가 분리되는 것을 방지할 수 있습니다.

미리 계산되는 실시간 GI(Precomputed Realtime GI)는 이 옵션에만 영향을 받는다는 점에 주의하시기 바랍니다. 선택된 메쉬에서 분리된 조각들은 유니티에서 다른 용도로 사용되기 위해서 보존됩니다.

 

크기가 큰 씬에서 반복 작업의 속도 향상시키기 (Faster iteration in larger Scenes)

복잡한 씬에는 수백(또는 수천)개의 정적 오브젝트(Static Object)가 포함되어 있을 수 있습니다. 이 모든 오브젝트에 대한 챠트 아틀라스를 생성하게되면, 라이팅을 계산하는 시간이 오래걸리고, 씬에서 반복적으로 이루어지는 작업이 처리되는 속도에 부정적인 영향을 미칠 수 있습니다.

오브젝트에대한 unwrap 설정항목을 테스트하는 경우, 테스트 하려는 해당 오브젝트만 빈 씬에 따로 배치해서 테스트하면 라이팅 계산 시간이 짧아지기 때문에 테스트를 빠르게 반복해서 진행할 수 있습니다. 테스트를 완료한 후에 설정항목 값을 다시 원래 씬에 배치된 해당 오브젝트에 적용합니다. 이렇게 필요한 오브젝트를 따로 빈 씬에 분리해서 테스트하는 방법을 활용하면, 씬에서 라이팅을 준비하는 시간을 크게 줄일 수 있습니다.

  • 예제 프로젝트에 포함된 LightingTutorialStart 씬을 엽니다.
  • 계층뷰에서 HouseBig02라는 이름의 오브젝트 그룹을 선택합니다. 이 오브젝트들은 Environment > Structures > Houses 아래에 있습니다.
  • Ctrl+C (Cmd+C on Mac) 키를 눌러서 이 오브젝트들을 복사합니다.
  • Ctrl+N (Cmd+N on Mac) 키를 눌러서 새 씬을 생성합니다.
  • 씬의 변경사항을 저장할지 여부를 묻는 창이 나타나면, 씬을 저장하려는 경우 Yes를 선택하고, 변경사항을 저장하고 싶지 않은 경우 No를 선택합니다.
  • 새로 생성된 씬에 Ctrl+V (Cmd+V on Mac) 키를 눌러서 HouseBig02를 붙여넣기 합니다.
  • Lighting 창(Window > Lighting)을 열고 Scene 탭을 선택합니다.
  • Auto 체크박스를 활성화시켜서 자동 라이팅계산 모드(Auto precompute mode)를 활성화시킵니다.
  • 이제 Object 탭을 선택합니다.
  • Object 탭의 왼쪽 상단에서 드롭다운 메뉴를 선택한 다음 Charting 메뉴를 선택합니다.
  • 오브젝트가 unwrapped 처리된 결과를 확인하기 위해서 미리보기 영역을 확장시킵니다.

 

라이팅을 미리 계산하는 시간을 최적화하기 위해서 unwrap 설정항목 조절하기 (Adjusting unwrap settings to optimize precompute times)

Unwrap 설정항목을 조절할때, 가장 이상적인 결과는 챠트(Chart)의 수와 라이트맵 왜곡을 최소화하는 값의 조합을 찾는 것입니다. UV Charts Draw 모드가 활성화된 상태에서, 씬뷰에서 오브젝트에 적용된 체크 무늬 텍스쳐의 늘어짐 여부를 통해서 왜곡을 시각적으로 확인할 수 있습니다.

checkerboardgood
체크 무늬 패턴은 라이트맵 텍셀 왜곡을 시각적으로 확인하는데 사용될 수 있습니다. 위의 그림에서 체크 무늬가 모델링에 걸쳐서 대체적으로 일정합니다 – 다시말해, 라이트맵 왜곡이 적습니다.

checkerboardbad
체크 무늬 패턴이 늘어지고 뒤틀렸다는 것은 라이트맵 텍셀의 배포가 일정하지 않다는 것을 나타냅니다.

이 예제에서, 오브젝트의 라이팅 계산 시간을 최적화하기 위한 UV unwrapping에 대해서 배운 내용을 튜토리얼 프로젝트에 적용합니다.

  • 예제 프로젝트에 포함된 LightingTutorialStart 씬을 엽니다.
  • 계층뷰에서 HouseBig02라는 이름의 오브젝트 그룹을 선택합니다. 이 오브젝트들은 Environment > Structures > Houses 아래에 있습니다.
  • Lighting 창(Window > Lighting)을 열고 Object 탭을 선택합니다.
  • 탭의 왼쪽 상단에서 드롭다운 메뉴를 선택한 다음 Charting 메뉴를 선택합니다.
  • 탭의 아래에 있는 미리보기 영역을 확장시킵니다. 여기에서 UV 쉘의 수와 해당하는 챠트(색생이 적용된)의 수를 확인합니다.

chartingpreview
기본 unwrap 설정이 적용된 HouseBig02 오브젝트에 대한 Charting 미리보기 화면을 보여주는 그림.

씬에서 HouseBig02는 상당히 복잡한 오브젝트로서, 다수의 챠트가 필요할 수 있습니다. 하지만, 아직 unwrap 설정항목을 조절해서 이 수를 감소시킬 수 있습니다.

objectunwrapsettings
오브젝트 unwrap 설정 패널.

오브젝트를 unwrapping 처리할때 모든 경우에 사용할 수 있는 만능 해결책은 없습니다. 유니티의 unwrapping 알고리즘은 기본 설정 값을 기반으로 납득할만한 수준의 결정을 하려고 노력하지만, 설정항목을 다소 조절하면, 좀 더 최적화된 결과를 얻을 수 있습니다.

  • 계층 뷰에서 HouseBig02를 선택합니다.
  • Lighting 창(Window > Lighting)을 열고 Object 탭을 선택합니다.
  • Auto UV Max Distance 값을 이 항목의 최소값인 0.1로 낮춥니다.

이렇게 하면, 라이팅을 계산 프로세스가 시작됩니다. 간단한 계산과정 후에, Lighting 창의 미리보기 영역에서 챠트의 수가 눈에띄게 증가한 것을 확인할 수 있습니다. 씬뷰를 확인해보면, 약간의 왜곡이 보이는 것을 확인할 수 있는데, 이정도는 괜찮은 것 같습니다. 하지만 불행하게도, 이렇게 복잡한 오브젝트에 대해서 이정도로 많은 챠트는 허용할 수 없습니다. 챠트의 수가 늘어날수록 라이팅을 계산하는 시간은 늘어나고, 런타임에서 성능은 감소한다는 것을 명심하시기 바랍니다.

  • HouseBig02가 선택되어있지 않다면, 계층뷰에서 HouseBig02를 선택합니다.
  • Lighting 창(Window > Lighting)을 열고 Object 탭을 선택합니다.
  • Auto UV Max Distance 값을 10으로 설정합니다.

 

이번에는 반대의 문제가 발생했습니다. 챠트의 수는 감소했지만, 라이트맵에서 허용할 수 없는 수준의 왜곡이 발생했습니다. 이 왜곡은 UV Charts Draw 모드에서 살펴볼 수 있습니다. 왜곡은 체크무늬 오버레이(overlay)가 늘어나거나 줄무늬 형태로 나타납니다.

lightmapdistortion
Auto UV Max Distance 항목에 너무 큰 값을 설정하면 라이트맵 UV의 왜곡이 발생할 수 있습니다.

유니티의 Unwrapping 알고리즘이, 여러 UV 쉘(Shell)의 병합을 통해서 챠트의 수를 최소화하는 방향으로 동작한다는 것을 이 글에서 살펴봤습니다. Auto UV Max Distance 설정항목은 월드공간(worldspace)단위의 병합이 고려되는 UV 쉘 간의 최대 거리를 지정합니다. UV 쉘 간의 거리가 이 값보다 큰 경우에는 서로 합쳐지지 않습니다.

Auto UV Max Distance 항목의 값을 낮게 설정하면, 병합되는 UV 쉘의 수가 줄어듭니다. 즉, 이 프로세스가 완료되면 더 많은 수의 개별 챠트가 남게됩니다. Auto UV Max Distance 항목의 값을 증가시키면 월드공간에서는 거리가 너무 멀리 떨어진 UV 쉘도 병합이 가능해집니다. 그 결과로 챠트의 수는 줄어들지만, 이런 공격적인 병합으로 인해서 라이트맵 UV에 뒤틀림이 발생할 수 있고, 결국 라이트맵의 출력결과에 왜곡이 생길 수 있습니다.

크기가 큰 오브젝트에는 종종, 메쉬의 표면의 크기를 수용하기 위해서, Auto UV Max Distance 값을 증가시킬 필요가 있다는 점을 명심합니다. 반대로, 크기가 작은 오브젝트에는 Auto UV Max Distance 값을 줄이면 좋은 결과를 얻을 수 있습니다. HouseBig02 오브젝트의 예에서는, Auto UV Max Distance 값을 0.8 로 설정하면, 챠트의 수와 왜곡 사이에서 적절히 타협된 결과를 얻을 수 있습니다.

  • HouseBig02가 선택되지 않은 경우, 계층뷰에서 오브젝트를 선택합니다.
  • Lighting 창(Window > Lighting)을 열고 Object 탭을 선택합니다.
  • Auto UV Max Distance 항목에 0.8을 설정합니다.

maxdistance08
예제 오브젝트의 경우, Auto UV Max Distance 값에 0.8 을 설정해서 좋은 결과를 나타냄.

하지만, 이 결과를 좀 더 좋게 만들수 있습니다. 이제 Auto UV Max Angle 파라미터를 살펴보겠습니다. Auto UV Max Distance와 같이, Auto UV Max Angle 값은 유니티의 unwrapping 알고리즘에서 UV 병합 단계에 영향을 줍니다. UV 쉘이 결합되는 거리를 테스트하는 것 외에도, unwrapper는 인접한 메쉬 표면 사이의 각도 또한 테스트합니다. 에지(edge) 사이의 각도가 이 항목의 설정 값보다 작은 경우에만 병합됩니다.

Auto UV Max Angle 값을 작게 설정하면, 더 적은 수의 에지들이 테스트를 통과하게 됩니다.그 결과로, 병합되는 UV 쉘의 수가 줄고, 챠트의 수는 증가합니다. 반대로, Auto UV Max Angle 항목에 큰 값을 설정하면, 병합 알고리즘에서 표면 사이의 각도를 좀 더 관대하게 처리합니다. 따라서 더 많은 UV 쉘이 병합되고, 그 결과로 챠트의 수가 줄어듭니다. Auto UV Max Distance와 마찬가지로, Auto UV Max Angle항목에 너무 큰 값을 설정해서 적절하지않은 에지가 결합된 경우, 최종 라이트맵 UV에서 왜곡이 발생할 수 있습니다.

  • HouseBig02가 선택되지 않은 경우, 계층뷰에서 오브젝트를 선택합니다.
  • Lighting 창(Window > Lighting을 열고 Object 탭을 선택합니다.
  • Auto UV Max Angle 항목에 0을 설정합니다.

 

Lighting 창의 미리보기 영역을 살펴보면, 생성된 챠트의 수가 허용할 수 없는 수준으로 높은 것을 알 수 있습니다. 이는 표면 사이의 각도가 0이하인 경우에만 병합이 되도록 설정했기 때문입니다. 이렇게 설정하면 거의 모든 UV 쉘이 테스트에 통과하지 못하고 결과적으로 병합 프로세스가 처리된 후에는 많은 챠트가 남게됩니다.

maxangle00
Auto UV Max Angle 항목의 값을 너무 낮게 설정해서 챠트의 수가 너무 많이 증가함.

다음에는, Auto UV Max Angle 값을 증가시켜볼 차례입니다.

  • HouseBig02가 선택되지 않은 경우, 계층뷰에서 오브젝트를 선택합니다.
  • Lighting 창(Window > Lighting)을 열고 Object 탭을 선택합니다.
  • Lighting 창의 미리보기 영역에서 값이 바뀔때마다 어떻게 변하는지를 잘 관찰하면서, Auto UV Max Distance 항목의 값을 천천히 증가시킵니다.

 

이 값이 증가하면서 챠트의 수가 감소하는 것을 확인할 수 있습니다. 이는 표면 사이의 병합이 허용되는 각도가 좀 더 커졌기 때문입니다. 더 많은 수의 UV 쉘이 병합 테스트에 통과하게되고 병합됩니다. 따라서, 라이트맵 UV 쉘의 수가 줄어들고, 해당하는 챠트의 수 역시 즐어듭니다.

maxangleincrease
Auto UV Max Angle 항목의 값을 증가시키면 챠트를 줄이는데 도움이 됩니다 – 특히, 둥근 표면을 가진 물체에서.

HouseBig02 오브젝트의 예에서는, Auto UV Max Angle 값을 93으로 설정하면 좋은 결과를 얻을 수 있습니다.

  • HouseBig02가 선택되지 않은 경우, 계층뷰에서 오브젝트를 선택합니다.
  • Lighting 창(Window > Lighting을 열고 Object 탭을 선택합니다.
  • Auto UV Max Angle 항목에 93을 설정합니다.

간단한 라이팅 계산과정 후에, Lighting 창의 미리보기 영역에서 챠트의 수가 얼마나 감소했는지 확인합니다.

 

chartinghousebig02
HouseBig02의 unwrap 몇몇 설정을 최적화한 후의 Charting 미리보기 화면.

이 단계에서, 테스트를 통해 얻은 최적화된 unwrap 설정 값을 다시 작업 씬(Scene)에 적용할 수 있습니다.

  • HouseBig02가 선택되지 않은 경우, 계층뷰에서 오브젝트를 선택합니다.
  • 인스펙터뷰에서, MeshRenderer 컴포넌트를 찾은 다음, 컴포넌트의 오른쪽 상단에 위치한 기어 모양의 아이콘을 클릭합니다.
  • Copy Component를 클릭합니다.
  • LightingTutorialStart 씬을 엽니다.
  • 계층뷰에서 HouseBig02라는 이름의 오브젝트를 찾습니다.
  • Ctrl(Cmd on the Mac) 키를 누른 상태에서 계층뷰내에 있는 HouseBig02 게임오브젝트를 모두 클릭합니다.
  • Lighting 창(Window > Lighting을 열고 Object 탭을 선택합니다.
  • 오른쪽 상단에 있는 기어 모양의 아이콘을 선택합니다.
  • Paste Component Values를 선택해서 이전에 복사한 설정을 적용합니다.

 

copycomponents
Copy Component를 이용하면 테스트 씬에서 메인 씬으로 unwrap 설정을 복사할때 유용합니다.

이런 설정들을 적절하게 최적화하면, 수백개의 오브젝트를 가진 씬에 이 설정 값이 적용됐을때, 훨씬 큰 최적화효과를 볼 수 있습니다.

 

 

Unwrap 설정: 인스턴스-당? 또는 프리팹-당? (Unwrap settings: per-instance or per-Prefab?)

프리팹에 포함되어 있는 Static MeshRenderer 컴포넌트의 설정항목을 저장하면, 프리팹을 이용해서 unwrap 설정항목을 저장할 수 있습니다. 다른방법으로, 씬의 개별 게임오브젝트를 이용해서도 unwrap 설정항목을 저장할 수 있습니다. 프리팹의 인스턴스(씬에 배치된 게임오브젝트)에 적용된 unwrap 설정은 프리팹에 저장된 설정항목을 덮어씁니다. 이런 작업 방식은 씬 라이팅을 설정할때 활용할 수 있습니다.

프리팹에 unwrapping 과 라이팅의 기본 설정을 저장해두면 유용하게 활용할 수 있습니다. 프리팹이 여러번 인스턴스화(객체 생성)되는 경우, 씬에서 반복적으로 unwrapping에 대한 설정작업을 하는 것보다 프리팹에 미리 설정된 값을 재사용하는 것이 훨씬 효율적입니다.

반면에, 씬에서 사용되는 오브젝트의 상황에 따라서 라이팅 설정을 조절해야하는 경우가 있습니다. 예를 들어, 프리팹의 인스턴스가 플레이 가능한 지역보다 화면에서 더 가까이 보이는 경우, 해당 인스턴스에 대해서 더 높은 품질의 설정을 사용하는 것이 좋습니다. 이와 반대로, 프리팹의 인스턴스가 멀리 떨어져있는 경우에, 같은 설정을 사용하면 라이팅 예산을 낭비하는 것이 됩니다. 이 경우, 라이트맵의 품질은 낮추고 unwrap 설정의 stitching 파라미터를 조절해서 좀 더 공격적으로 병합될 수 있도록 설정하는 것이 좋습니다.

대부분의 상황에서 사용하기에 적절한 값을 기본 설정으로 저장한 다음, 특별한 경우에 기본 설정값을 조절하는 것이 효율적입니다. 이 글의 라이팅 예제에서는, 씬 내의 인스턴스-당 설정 방법을 적용합니다.

 

씬 전체에 unwrap 설정 적용하기 (Applying unwrap settings throughout the Scene)

이제 LightingTutorialStart 씬의 남은 부분에, 지금까지 유니티의 자동 unwrapping 알고리즘에 대해서 배운 내용을 적용할 차례입니다. 체계적인 작업을 통해서, 라이팅을 미리 계산하는 시간을 크게 향상시키기 위해서 씬을 설정하는데 오래 걸리지 않도록 하는 것이 좋습니다.

  • 예제 프로젝트에 포함되어있는 LightingTutorialStart 씬을 엽니다.
  • 계층뷰에서 Environment > Structures 아래에서 제일 위에 있는 게임오브젝트를 선택합니다.
  • 선택한 게임오브젝트를 빈 씬에 복사합니다.

이제, unwrap 파라미터에 대해서 배운 내용을 적용하고 서로 다른 값을 적용해가면서 테스트 합니다. UV Chart Scene Draw 모드와 Lighting 창의 미리보기 영역에서 Charting 모드를 함께 사용합니다. 이를 이용하면, 라이트맵 왜곡과 필요한 챠트의 수 간의 적절한 균형을 찾는데 도움이 됩니다.

테스트를 하는 과정에서 적절한 값을 찾기 어려울 경우, LightingTutorialOptimal 씬을 참고해서 작업할 수 있습니다. unwrap 설정항목의 기본 설정 값을 바꿀 필요가 없는 경우도 있다는 점을 명심합니다. 이런 경우에, 기본 값을 적용하면 최적의 결과를 얻을 수 있습니다.

  • 챠트의 수와 라이트맵의 왜곡 사이의 적절한 균형점에 도달할때까지, unwrap 파라미터를 바꿔가면서 테스트합니다.
  • 설정을 복사한 다음, LightingTutorialStart 씬으로 돌아와서, 동일한 게임오브젝트의 모든 인스턴스에 복사한 값을 붙여넣기 합니다. 계층뷰에서 다중 선택(Multi-selecting)을 이용해서 해당하는 모든 오브젝트를 선택한 다음, Paste Component Values 메뉴를 이용해서 여러 오브젝트에 빠르게 복사한 설정 값을 적용할 수 있습니다.
  • 계층뷰에서 고유하게 이름 붙은 게임오브젝트에 대해서 각각 위의 과정을 반복합니다.

Structures 그룹 아래에 있는 모든 게임오브젝트가 최적화되었으면, Rocks 그룹 아래에 위치한, 나머지 Static Geometry로 이동합니다. 이런 방식으로 체계적으로 작업하면, 씬 내의 모든 Static 메쉬에 unwrap 값을 설정하는데 몇 분 정도면 됩니다. 이렇게 수동으로 준비한 설정 값을 적용하면, 씬에 라이팅을 배치하기위해서 반복하는 작업의 속도가 빨라지고, 런타임에서 성능이 향상됩니다.

 

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

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

감사합니다 🙂

 

다음글 – Understanding Clusters

RonnieJ

프리랜서 IT강사로 활동하고 있습니다. 게임 개발, C++/C#, 1인 기업에 관심이 많습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Please turn AdBlock off

Notice for AdBlock users

Please turn AdBlock off