Version: 2022.1
언어: 한국어
라이트매핑 및 셰이더
라이트맵 UV 소개

라이트맵 UV 소개

실시간 전역 조명 시스템과 베이크된 전역 조명 시스템은 모두 라이트맵을 사용하므로 라이트맵 UV가 필요합니다.

Unity는 실시간 전역 조명 시스템과 베이크된 전역 조명 시스템에 대해 별도의 라이트맵 UV 세트를 사용합니다. 여기에는 다음과 같은 두 가지 이유가 있습니다.

  • 실시간 라이트맵과 베이크된 라이트맵 사이의 인스턴스 그룹화에는 직접적인 대응 관계가 없습니다. 동일한 실시간 라이트맵에 있는 인스턴스는 서로 다른 두 개의 베이크된 라이트맵에 있을 수도 있고 없을 수도 있습니다.
  • 서로 다른 스케일로 나타나는 메시는 베이크된 라이트맵에서 라이트맵 UV를 공유하지만 실시간 라이트맵에서는 UV를 공유하지 않습니다.

베이크된 라이트맵 UV

베이크된 라이트맵 UV는 메시별로 되어 있습니다. 동일한 메시의 모든 인스턴스는 동일한 베이크된 라이트맵 UV를 공유합니다. Unity는 모델을 임포트할 때 베이크된 라이트맵에 대한 UV를 계산할 수 있으며 직접 데이터를 제공할 수도 있습니다.

Unity는 해당 메시에 있는 베이크된 라이트맵 UV를 Mesh.uv2 채널에 저장합니다. 이 채널은 TEXCOORD1 셰이더 시맨틱에 매핑되며 이는 보통 “UV1”이라고 부릅니다.

베이크된 전역 조명이 활성화되고 특정 메시 렌더러가 라이트맵에서 해당 전역 조명을 수신하는 경우 Unity는 Mesh.uv2 채널의 데이터를 사용하여 베이크된 라이트맵을 메시로 올바르게 매핑합니다.

참고: 특정 메시에서 다른 용도로 Mesh.uv2를 사용하고자 하는 경우 메시를 사용하는 모든 MeshRenderer 컴포넌트가 라이트맵이 아닌 라이트 프로브에서 전역 조명을 수신하도록 해야 합니다. Mesh Renderer 컴포넌트 인스펙터MeshRenderer.receiveGI API를 사용하여 이를 변경합니다.

자세한 내용은 라이트맵 UV 생성을 참조하십시오.

실시간 라이트맵 UV

실시간 라이트맵 UV는 메시 렌더러별로 되어 있습니다. 동일한 메시의 모든 인스턴스는 동일한 입력 데이터를 사용하지만 메시 렌더러의 서로 다른 인스턴스는 런타임 시 다른 실시간 라이트맵 UV를 사용할 수 있습니다. Unity는 사전 계산 단계에서 실시간 전역 조명 시스템에 대한 UV를 계산합니다. 이 계산은 메시별 UV를 입력으로 가져와 해당 데이터를 사용하여 메시 렌더러별 UV를 생성합니다. Unity가 모델을 임포트할 때 메시 UV별 입력을 생성하거나 직접 데이터를 제공할 수 있습니다.

이는 다음과 같이 작동합니다.

  • Unity는 실시간 라이트맵 UV 계산에 대해 Mesh.uv3 채널의 데이터를 입력으로 사용할 수 있습니다. Mesh.uv3은 TEXCOORD2 셰이더 시맨틱에 매핑되며 이를 보통 “UV2”라고 부릅니다.
  • Mesh.uv3에는 데이터가 없지만 Mesh.uv2에는 데이터가 있는 경우 Unity는 실시간 라이트맵 UV 계산을 위한 입력으로 Mesh.uv2 안의 데이터를 사용하는 것으로 폴백합니다. Mesh.uv2는 베이크된 라이트맵 UV에 사용됩니다. 흔히 실시간 라이트맵 UV를 위한 입력 데이터로 베이크된 라이트맵 UV를 사용합니다.
  • 계산 결과는 메시 렌더러별로 MeshRenderer.enlightenVertexStream에 저장됩니다.실시간 전역 조명이 활성화되어 있고 지정된 MeshRenderer 컴포넌트가 전역 조명에 기여하고 라이트맵에서 전역 조명을 수신하는 경우 Unity는 자동으로 MeshRenderer.enlightenVertexStream의 데이터를 Mesh.uv3의 데이터 대신 셰이더의 TEXCOORD2에 전달합니다.

참고:실시간 전역 조명을 사용하는 메시에서 다른 용도로 Mesh.uv3를 사용하려면 메시를 사용하는 모든 MeshRenderer 컴포넌트가 라이트맵이 아닌 라이트 프로브에서 전역 조명을 받도록 해야 합니다.이것을 Mesh Renderer 컴포넌트 인스펙터 또는 MeshRenderer.receiveGI API를 사용하여 변경합니다.

자세한 내용은 라이트맵 UV 생성을 참조하십시오.

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

Unity가 메시별 입력 UV를 가져와 메시별 렌더러 출력 UV로 처리할 때 발생하는 작업입니다.

패킹

Unity는 실시간 라이트맵 UV를 리패킹하여 각 차트의 경계가 모든 방향에서 텍셀의 중심에 들어오도록 한 다음 각 차트의 경계 주변에 패딩의 하프 텍셀을 추가해야 합니다. 이렇게 하면 모든 차트는 차트 사이에 텍셀 공간 하나를 갖게 됩니다.

이는 실시간 라이트맵 해상도를 의도적으로 낮추어 실시간으로 업데이트를 할 수 있기 때문입니다. 낮은 해상도는 이러한 라이트맵이 낮은 주파수의 간접 조명만 저장하기 때문에 그래픽 품질에 영향을 주지 않지만 차트가 텍셀을 공유하면 블리딩 문제가 발생할 수 있습니다. 리패킹은 차트가 텍셀을 공유하지 않게 합니다. 이렇게 하면 이 문제를 방지하고 또한 Unity는 효율적으로 차트를 나란히 패킹할 수 있습니다.

참고: 이 패킹 기법은 계산된 UV가 인스턴스의 스케일과 라이트맵 해상도에 의존하여 실시간 라이트맵 UV가 메시 렌더러별로 되어 있다는 의미입니다. 하지만 Unity는 가능한 경우 이를 자동으로 최적화하고 동일한 스케일과 라이트맵 해상도로 동일한 메시를 사용하는 메시 렌더러는 동일한 UV를 공유합니다.

병합

Unity가 가능한 경우 이 프로세스 동안 UV 차트를 병합하도록 지시할 수도 있습니다. 이렇게 하면 라이트맵의 크기를 줄이고 런타임 메모리 사용과 성능을 개선할 수 있습니다.

Mesh Renderer 컴포넌트를 사용하여 모든 게임 오브젝트에 이 최적화를 활성화할 수 있습니다. 메시 렌더러 인스펙터에서 Lightmapping 섹션과 Optimize Realtime UVs로 이동합니다.

참고: 이 기능은 간혹 원본 UV 매핑의 불연속성을 잘못 이해하기도 합니다. 예를 들어 의도적으로 날카롭게 만든 모서리를 연속 표면이라고 잘못 해석할 수 있습니다. 이런 문제가 발생할 경우 이 기능을 비활성화해야 합니다.

라이트매핑 및 셰이더
라이트맵 UV 소개