Unity 6.3
0 онлайн 20 гостей 3 в системе
Вход

Введение в Lightmap UVs

Карты освещения — это предварительно рассчитанные текстуры освещения, хранящие освещённость статической геометрии. Unity формирует их в несколько этапов, превращая данные 3D-мешей в оптимизированные 2D-текстуры. Карты освещения используют и система Realtime Global Illumination, и система Baked Global Illumination, поэтому им нужны UV карт освещения.

Процесс создания lightmap выглядит следующим образом: * UV Отображение: Для каждой сетки, Unity создает UV макет с UV картами. Поле разделяет карты в пределах одного и того же макета. * Упаковка: Unity упаковывает несколько UV макетов в общий UV атлас. Заполнение между различными UV макетами в атласе оптимизирует текстурное пространство и предотвращает выпадение текстуры. * Генерирование текстуры: Unity преобразует UV атлас в окончательную текстуру lightmap, которая содержит предварительно рассчитанные данные освещения.

Unity использует отдельные наборы lightmap UVs для системы Realtime Global Illumination и системы Baked Global Illumination. Это происходит по двум причинам:

  • Нет прямого соответствия в группировании экземпляров между реально-временными и печеными картами освещения; экземпляры, которые находятся в одной и той же реально-временной карте освещения, могут находиться в двух разных печеных картах освещения, и наоборот.
  • Меши, которые появляются в разных масштабах, имеют общую карту освещения UVs в печеных картах освещения, но не имеют общую карту освещения UVs в картах освещения реального времени.

Запеченное UVs

Запечённые карты освещения UVs являются индивидуальными: все экземпляры одной и той же сетки имеют одну и ту же запеченную карту освещения UVs. Unity может рассчитать UVs для запечённых карт освещения при импорте модели, или вы можете предоставить свои собственные данные.

Unity хранит запеченную карту освещения UVs в своей сетке в канале Mesh.uv2. Этот канал отображается на семантику шейдера TEXCOORD1 и обычно называется “UV1”.

Если включен режим Baked Global Illumination и заданный MeshRenderer получает глобальное освещение от lightmaps, Unity использует данные в каналах Mesh.uv2 для правильного отображения baked lightmaps на сетку.

Примечание: Если вы хотите использовать Mesh.uv2 для другой цели в данной сетке, вы должны убедиться, что все компоненты MeshRenderer, которые используют сетку, получают глобальное освещение от Световых Проб, а не от карт освещения. Измените это с помощью компонента Mesh Renderer Inspectorили MeshRenderer.receiveGI API.

Дополнительные сведения см. в Создание карты освещения UVs.

Карта освещения реального времени UVs

Карты освещения реального времени UVs являются рендерами по сеткам: все экземпляры одной и той же сетки имеют одни и те же входные данные, но различные экземпляры рендеров по сеткам могут использовать различные карты освещения реального времени UVs во время выполнения. Unity рассчитывает UVs для системы глобального освещения в реальном времени на этапе предварительного вычисления. Этот расчет принимает UVs по сеткам в качестве входа и использует эти данные для создания рендера по сеткам UVs. Unity может генерировать вход по сеткам UVs при импорте модели, или вы можете предоставить свои собственные данные.

Это работает следующим образом:

  • Unity может использовать данные в канале Mesh.uv3 в качестве входа для расчетов в реальном времени lightmap UV. Mesh.uv3 отображается на семантику шейдера TEXCOORD2 и обычно называется “UV2”.
  • Если в Mesh.uv3 нет данных, но есть данные в Mesh.uv2, Unity возвращается к использованию данных в Mesh.uv2 в качестве входных данных для расчетов карты освещения реального времени UV. Mesh.uv2 используется для запечённой карты освещения UVs. Обычно запечённая карта освещения UVs используется в качестве входных данных для карты освещения реального времени UVs.
  • Результаты расчетов хранятся по-MeshRenderer, в MeshRenderer.enlightenVertexStream. Если Глобальное освещение в реальном времени включено и данный компонент MeshRenderer вносит свой вклад в глобальное освещение и получает его глобальное освещение от lightmaps, Unity автоматически передает данные из MeshRenderer.enlightenVertexStream в TEXCOORD2 в шейдерах, вместо данных из Mesh.uv3.

Примечание: Если вы хотите использовать Mesh.uv3 для другой цели в сетке, которая использует глобальное освещение в реальном времени, вы должны убедиться, что все компоненты MeshRenderer, которые используют сетку, получают глобальное освещение от Световых зондов, а не от карт освещения. Измените это с помощью компонента Mesh Renderer Inspectorили MeshRenderer.receiveGI API.

Дополнительные сведения см. в Создание карты освещения UVs.

Как Unity рассчитывает карту освещения в реальном времени UVs

Это происходит, когда Unity принимает входные данные по сеткам UVs и обрабатывает их в выходные данные по сеткам UVs.

Упаковка

Unity перепаковывает lightmap реального времени UVs, чтобы гарантировать, что граница каждой диаграммы падает на центр текселя во всех направлениях, а затем добавляет половину текселя поля вокруг границы каждой диаграммы. Это гарантирует, что все диаграммы имеют полный тексель поля между ними.

Это потому, что разрешение карт освещения реального времени намеренно низкое, чтобы сделать возможным обновление их в реальном времени. Низкое разрешение не влияет на качество графики, так как эти карты освещения хранят только низкочастотное косвенное освещение, но это может привести к кровотечению, когда карты имеют общие тексты. Перепаковка обеспечивает, что карты никогда не имеют общих текстов. Она избегает этой проблемы, а также позволяет Unity эффективно упаковывать карты рядом друг с другом.

Карта освещения в реальном времени UVs упаковка
Карта освещения в реальном времени UVs упаковка

Примечание: Этот метод упаковки означает, что вычисленные UVs зависят от масштаба и разрешения карты освещения экземпляра, поэтому карта освещения реального времени UVs относится к рендеру сетки; однако Unity автоматически оптимизирует это, когда это возможно, и рендеры сетки, использующие одну и ту же сетку с одинаковым масштабом и разрешением карты освещения, имеют одинаковые UVs.

Слияние

По желанию, вы можете поручить Unity объединять диаграммы UV, где это возможно, во время этого процесса. Это уменьшает размер lightmaps и может улучшить использование памяти и производительность.

Вы можете включить эту оптимизацию на любом GameObject с компонентом Mesh Renderer. В Mesh Renderer Inspectorперейдите в раздел Лайтмаппинг и Optimize Realtime UVs.

Примечание: Эта функция иногда допускает ошибки, связанные с отсутствием непрерывности в первоначальном отображении UV. Например, намеренно острый край может быть ошибочно интерпретирован как непрерывная поверхность. Если это происходит, отключите эту функцию.