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

Texture2D.PackTextures

Declaration

public Rect[] PackTextures(Texture2D[] textures, int padding, int maximumAtlasSize, bool makeNoLongerReadable);

Параметры

Параметр Описание
текстуры Массив текстур для упаковки в атлас.
прокладка Заполнение в пикселях между упакованными текстурами.
maximumAtlasSize Максимальный размер текстуры.
makeNoLongerReadable Следует ли помечать текстуру как более не читаемую?

Возвращаемое значение

Rect[] Массив прямоугольников, содержащих координаты UV в атласе для каждой входной текстуры, или нуль, если упаковка не удалась.

Описание

Упаковка нескольких текстур в атлас текстур.

Эта функция заменит текущую текстуру на атлас, созданный из предоставленных текстур. Размер, формат и mipmaps любой из текстур могут измениться после упаковки.

Результирующий атлас текстур будет настолько большим, насколько это необходимо, чтобы поместить все вводимые текстуры, но только до maximumAtlasSize в каждом измерении. Если вводимые текстуры не могут поместиться в атлас текстур желаемого размера, то они будут уменьшены, чтобы поместиться.

При следующих условиях атлас будет создан как несжатая текстура с использованием формата TextureFormat.RGBA32:

  • Если не все входные текстуры сжаты.
  • Если некоторые входные текстуры имеют mipmaps, а другие нет.
  • Если сжатые входные текстуры имеют mipmaps и padding > 0. Это связано с ограничениями по выравниванию на сжатых текстурных форматах.

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

Код упаковки атласа поддерживает только следующие форматы текстур:

  • ARGB4444
  • ETC
  • ETC2
  • DXT1
  • DXT5
  • BC7
  • ASTC Полноприводной

Все входные текстуры должны иметь один и тот же формат сжатия или быть смесью совместимых форматов сжатия, в противном случае формат атласа возвращается к несжатому. Варианты одного и того же сжатого формата могут быть смешаны в атласе, где они остаются сжатыми:

Однако, если вводные текстуры смешивают несвязанные форматы, такие как BC7 с ASTC 4x4 или DXT5, это приводит к тому, что код упаковки атласа возвращается к TextureFormat.RGBA32.

Если ни одна из вводных текстур не имеет mipmaps, то в атласе также нет mipmaps. Использование сжатых вводных текстур различного размера с mipmaps ограничит получаемое в результате atlas mipcount до величины наименьшей вводной текстуры минус два. Это делается для того, чтобы обеспечить заполнение каждым элементом атласа уровня mip по крайней мере одного блока сжатых данных. Это может привести к снижению производительности GPU, поскольку более крупные элементы атласа будут ограничены в их способности уменьшить давление кэша текстуры путем выборки уровней mip более низкого разрешения. Для оптимальной производительности рекомендуется упаковывать вводные текстуры одинакового размера в разные атласы.

Возьмём следующий пример сжатого атласа:

  • Один элемент 256x256 с общей численностью 9 уровней mip.
  • Другой пункт — 1024x2048 с общей суммой 12 уровней mip.

Полученный сжатый атлас будет иметь только 7 уровней mip:

  • Самый маленький элемент (256x256) должен уменьшить 2 из своих уровней mip (1x1 и 2x2), чтобы удовлетворить требование выравнивания размера блока сжатия (4x4).
  • Самый большой элемент (1024x2048) должен будет уменьшиться на 5 уровней mip, при этом его наименьший уровень mip будет равен 32x32.

Упаковка обеих текстур в разные атласы с одинаковыми размерами элементов, например, один для элементов с минимальным размером 256 и другой с минимальным размером 1024, уменьшит количество уровней mip, которые теряются при атласировании.

Если makeNoLongerReadable является true, то текстура будет помечена как нечитаемая и память будет высвобождена после загрузки в GPU. По умолчанию makeNoLongerReadable установлено на false.

using UnityEngine;

public class Example : MonoBehaviour { // Source textures. Texture2D[] atlasTextures;

// Rectangles for individual atlas textures. Rect[] rects;

void Start() { // Pack the individual textures into the smallest possible space, // while leaving a two pixel gap between their edges. Texture2D atlas = new Texture2D(8192, 8192); rects = atlas.PackTextures(atlasTextures, 2, 8192); } }