Unity 라이트맵 UV 소개

개요

Unity는 실시간 전역 조명 시스템과 베이크된 전역 조명 시스템에서 라이트맵을 사용하기 위해 라이트맵 UV가 필요합니다. 이 문서에서는 베이크된 라이트맵 UV와 실시간 라이트맵 UV의 차이점을 설명하고, Unity에서 이 UV를 어떻게 관리하는지에 대해 알아보겠습니다.

라이트맵 UV의 필요성

  • 실시간 라이트맵과 베이크된 라이트맵은 서로 다른 UV 세트를 사용합니다. 이는 다음과 같은 이유 때문입니다:
  • 실시간 라이트맵과 베이크된 라이트맵 사이의 인스턴스 그룹화에는 직접적인 관계가 없으며, 서로 다른 베이크된 라이트맵에서 같은 실시간 라이트맵 인스턴스가 존재할 수 있습니다.
  • 메시는 베이크된 라이트맵에서 UV를 공유할 수 있지만, 실시간 라이트맵에서는 이를 공유하지 않습니다.

베이크된 라이트맵 UV

  • 모든 인스턴스는 동일한 메시를 기반으로 하며, Unity는 모델을 임포트할 때 베이크된 라이트맵 UV를 자동으로 계산합니다.
  • 이런 UV는 Mesh.uv2 채널에 저장되며, 보통 "UV1"이라고 불립니다.
  • 만약 다른 용도로 Mesh.uv2를 사용하고 싶으면, MeshRenderer가 라이트 프로브에서 전역 조명을 수신하도록 해야 합니다.

실시간 라이트맵 UV

  • 실시간 라이트맵 UV는 메시 렌더러별로 관리되며, Unity는 사전 계산 단계에서 UV를 계산합니다.
  • Mesh.uv3 채널의 데이터를 사용하거나, Mesh.uv2의 데이터를 대체하여 실시간 라이트맵 UV를 생성합니다.
  • Mesh.uv3는 텍스코드 2 셰이더 시맨틱(TEXCOORD2)에 매핑되며 이를 "UV2"라고 부릅니다.

Unity의 실시간 라이트맵 UV 계산 방법

  1. 패킹: Unity는 정상적으로 UV를 패킹하여 각 차트의 경계가 텍셀의 중심에 오도록 하며, 차트 간의 공간을 추가하여 블리딩 문제를 방지합니다.
  2. 병합: 가능한 경우 UV 차트를 병합하여 라이트맵 크기를 줄이고 성능을 개선할 수 있습니다.

예제 코드

다음은 UV 계산 및 최적화를 위한 간단한 C# 코드 스니펫입니다.

public class LightmapUVExample : MonoBehaviour
{
    private void Start()
    {
        // MeshRenderer 컴포넌트 가져오기
        MeshRenderer meshRenderer = GetComponent<MeshRenderer>();

        // 라이트맵 수신 설정
        meshRenderer.receiveGI = ReceiveGI.Lightmaps;

        // UV 최적화 설정
        meshRenderer.lightMapping = LightmapEditorSettings.LightmapMode();
    }
}

마무리

라이트맵 UV는 Unity에서 실시간 조명효과를 구현하는 데 중요한 요소입니다. 베이크된 UV와 실시간 UV를 적절하게 사용하여 최적의 성능을 끌어낼 수 있습니다. 더 자세한 정보는 관련 문서를 참조하십시오.