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 계산 방법
- 패킹: Unity는 정상적으로 UV를 패킹하여 각 차트의 경계가 텍셀의 중심에 오도록 하며, 차트 간의 공간을 추가하여 블리딩 문제를 방지합니다.
- 병합: 가능한 경우 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를 적절하게 사용하여 최적의 성능을 끌어낼 수 있습니다. 더 자세한 정보는 관련 문서를 참조하십시오.