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

Graphics.CopyTexture

Declaration

public static void CopyTexture(Texture src, Texture dst);
public static void CopyTexture(Texture src, int srcElement, Texture dst, int dstElement);
public static void CopyTexture(Texture src, int srcElement, int srcMip, Texture dst, int dstElement, int dstMip);
public static void CopyTexture(Texture src, int srcElement, int srcMip, int srcX, int srcY, int srcWidth, int srcHeight, Texture dst, int dstElement, int dstMip, int dstX, int dstY);
public static void CopyTexture(Rendering.GraphicsTexture src, Rendering.GraphicsTexture dst);
public static void CopyTexture(Rendering.GraphicsTexture src, int srcElement, Rendering.GraphicsTexture dst, int dstElement);
public static void CopyTexture(Rendering.GraphicsTexture src, int srcElement, int srcMip, Rendering.GraphicsTexture dst, int dstElement, int dstMip);
public static void CopyTexture(Rendering.GraphicsTexture src, int srcElement, int srcMip, int srcX, int srcY, int srcWidth, int srcHeight, Rendering.GraphicsTexture dst, int dstElement, int dstMip, int dstX, int dstY);

Параметры

Параметр Описание
сердце Исходная текстура для копирования, указанная как Texture или как GraphicsTexture.
дст Текстура назначения для копирования, указанная как Texture или как GraphicsTexture.
srcElement Элемент в исходной текстуре, из которого будет копироваться текстура. Например, CubemapFace в кубическом отображении или слой в массиве текстур. Установите значение 0, если src является текстурой 2D.
srcMip Уровень mipmap для копирования. Диапазон 0 через текстуру Texture.mipmapCount или GraphicsTextureDescriptor.mipCount. Значение по умолчанию 0.
dstElement Элемент в текстуре назначения для копирования. Например, CubemapFace в кубическом отображении или слой в массиве текстур. Установите значение 0, если `dst` является текстурой 2D.
dstMip Уровень mipmap для записи. Диапазон 0 через текстуру Texture.mipmapCount или GraphicsTextureDescriptor.mipCount. Значение по умолчанию 0.
srcX Начальная координата x src для копирования области. Приемлемые значения от 0 до ширины src на указанном srcMip. 0 — левая сторона текстуры.
srcY Начальная координата y src для копирования области. Приемлемые значения от 0 до высоты src на указанном srcMip. 0 — нижняя часть текстуры.
srcWidth Ширина области для копирования. Принятые значения больше или равны 0 и обеспечивают, что область вписывается в src на указанном srcMip с учетом смещения (srcX, srcY), и в dst на указанном dstMip с учетом смещения (dstX, dstY).
srcHeight Высота копируемой области. Принятые значения больше или равны 0 и обеспечивают, что область вписывается в src на указанном srcMip с учетом смещения (srcX, srcY), и в dst на указанном dstMip с учетом смещения (dstX, dstY).
dstX Начальная координата x dst для копирования области. Приемлемые значения в диапазоне от 0 до ширины dst на указанном dstMip. 0 — левая сторона текстуры.
dstY Начальная y-координата dst для копирования области. Приемлемые значения в диапазоне от 0 до высоты dst на указанном dstMip. 0 — нижняя часть текстуры.

Описание

Копирует данные пикселей из одной текстуры в другую.

Этот метод копирует пиксельные данные из одной текстуры в другую на GPU. Если Texture.isReadable является true для src и dst, метод также пытается скопировать пиксельные данные на CPU путем запуска метода CopyPixels, такого как Texture2D.CopyPixels. Если Texture.isReadable является false для src или dst, или они предоставлены как тип GraphicsTexture, никакие пиксельные данные не будут скопированы на CPU и CopyTexture становится одним из самых быстрых способов копирования текстуры. Предупреждение: Будьте осторожны при использовании метода Apply, такого как Texture2D.Apply после CopyTexture, потому что вы можете скопировать старые или неопределенные данные текстуры CPU в GPU.

Чтобы использовать CopyTexture, следующее должно быть одинаковым как в исходной, так и в конечной текстурной области:

Возможность копирования между несовместимыми форматами зависит от графического API. Например, некоторые API позволяют копировать данные между форматами с одинаковой разрядностью.

В зависимости от графического API копирование между текстурами разных типов может быть недоступно. Подробнее о совместимости см. SystemInfo.copyTextureSupport и CopyTextureSupport.

Если src является целевым буфером отрисовки только для глубины, необходимо копировать всю текстуру, а не её часть. У текстуры отрисовки только для глубины формат буфера цвета формат цвета имеет значение None, а для буфера глубины задан допустимый RenderTexture.depthStencilFormat. У графической текстуры глубины свойству format назначен допустимый GraphicsFormat с компонентом глубины.

При использовании QualitySettings.globalTextureMipmapLimit, Texture2D.mipmapLimitGroup и Texture2D.ignoreMipmapLimit текстуры могут иметь разные настройки ограничения mip-уровней. Из-за этого копирование с одного mip-уровня на другой может быть невозможно: например, исходная текстура ограничена половинным разрешением, а целевая — четвертью разрешения. Это ограничение не действует, когда src и dst заданы как графические текстуры: число их mip-уровней уже ограничено, и они представляют только загруженные в данный момент уровни.

Чтобы скопировать mip-уровень между текстурами с разными настройками ограничения mip-уровней, используйте перегрузку с указанием области. Она корректирует прямоугольник источника с учётом ограничения mip-уровней исходной текстуры, а смещение назначения — с учётом ограничения целевой текстуры. Например, копирование области 128×128 из позиции 16,16 в позицию 32,32 выполняется по-разному в зависимости от глобального ограничения mip-уровней текстур, типа исходной текстуры и типа целевой текстуры:

  • Когда глобальное ограничение текстуры mipmap равняется 0, и обе текстуры подчиняются этому ограничению, Unity выполняет все копии как ожидалось.
  • Когда глобальное ограничение текстуры mipmap равняется 2, и обе текстуры подчиняются этому ограничению, Unity настраивает исходный прямоугольник на 32x32 и его смещение на 4,4, затем меняет смещение назначения на 8x8. Unity затем выполняет все копии как ожидалось и игнорирует все ограничения mipmap.
  • Когда глобальное ограничение текстуры mipmap равняется 2, источник является текстурой, подчиненной ему, а назначение — текстурой, не подчиненной ему, Unity изменяет прямоугольник источника на 32x32 и его смещение на 4,4, но не изменяет смещение назначения, которое остается 32x32.

Следующий пример показывает, как можно копировать в или из Texture2DArray, когда Texture2Ds имеет ограничения mipmap:

using UnityEngine;

public class CopyTextureSample : MonoBehaviour { // Sample to copy all available mips: inTex -> outArray (no mipmap limits) -> outTex [SerializeField] Texture2D inTex; [SerializeField] Texture2DArray outArray; [SerializeField] Texture2D outTex; [SerializeField] bool considerMipmapLimits;

void Start() { int width = inTex.width; int height = inTex.width;

outArray = new Texture2DArray(width, height, 1, inTex.format, true); outTex = new Texture2D(width, height, inTex.format, true);

if (!considerMipmapLimits) { // Texture2D -> Texture2DArray // Global Mipmap Limit: "1: Half Resolution" => copies into mips that are now too large; will copy each mip of inTex into a quarter of outArray for (int mip = 0; mip < inTex.mipmapCount; ++mip) { int copyWidth = width >> mip; int copyHeight = height >> mip; Graphics.CopyTexture(inTex, 0, mip, 0, 0, copyWidth, copyHeight, outArray, 0, mip, 0, 0); }

// Texture2DArray -> Texture2D // Global Mipmap Limit: "1: Half Resolution" => errors, since we try to copy into mips that are now too small for (int mip = 0; mip < outArray.mipmapCount; ++mip) { int copyWidth = width >> mip; int copyHeight = height >> mip; Graphics.CopyTexture(outArray, 0, mip, 0, 0, copyWidth, copyHeight, outTex, 0, mip, 0, 0); } } else // considering mipmap limits { int globalMipmapLimit = QualitySettings.globalTextureMipmapLimit;

// Texture2D -> Texture2DArray // Global Mipmap Limit: "1: Half Resolution" => mip0 of outArray is not written to, other mips copy as expected // (ALTERNATIVE: if outArray creation already considered globalMipmapLimit for its dimensions, // the CopyTexture call can ignore globalMipmapLimit since the mips will line up again) for (int mip = 0; mip < inTex.mipmapCount - globalMipmapLimit; ++mip) { int copyWidth = width >> mip; int copyHeight = height >> mip; int srcMip = mip; int dstMip = mip + globalMipmapLimit; Graphics.CopyTexture(inTex, 0, srcMip, 0, 0, copyWidth, copyHeight, outArray, 0, dstMip, 0, 0); }

// Texture2DArray -> Texture2D // Global Mipmap Limit: "1: Half Resolution" => mip0 of outArray is not copied (but outTex does not upload it to GPU anyway) for (int mip = globalMipmapLimit; mip < outArray.mipmapCount; ++mip) { int copyWidth = width >> mip; int copyHeight = height >> mip; int srcMip = mip; int dstMip = mip - globalMipmapLimit; Graphics.CopyTexture(outArray, 0, srcMip, 0, 0, copyWidth, copyHeight, outTex, 0, dstMip, 0, 0); } } } }

Аргументы уровня Mipmap всегда относятся к текущим загруженным уровням mipmap текстуры (которые можно найти с помощью GraphicsTextureDescriptor.mipCount для текстуры Texture.graphicsTexture). Например, если глобальное ограничение mipmap текстуры установлено на 0, mip 1 текстуры 256x256 относится к 128x128 mip. Однако, для той же текстуры, если глобальное ограничение mipmap текстуры установлено на 1, mip 1 относится к 64x64 mip. Если глобальное ограничение mipmap текстуры установлено на 2, mip 1 этой же текстуры относится к 32x32 mip (и так далее).

Это означает, что при использовании CopyTextureв большинстве случаев не нужно принимать во внимание параметры ограничения mipmap в вызовах. Однако, если вы используете Textures и параметры ограничения mipmap источника и назначения отличаются, вам нужно настроить эти параметры. Имейте в виду, что типы текстур, не относящиеся к 2D, всегда загружаются в GPU в полном разрешении, поскольку они не поддерживают ограничения mipmap любого рода.

Сжатые форматы текстуры добавляют некоторые ограничения к CopyTexture с региональным вариантом. Например, форматы PVRTC не поддерживаются, поскольку они не блоковые (для этих форматов можно копировать только всю текстуру или весь уровень mip). Для блоковых форматов (e.g. DXT, BCn, ETC) размер области и координаты должны быть кратными размеру блока сжатия (4 пикселя для DXT).

Примечание: формат PVRTC устарел. Используйте вместо него формат ASTC или ETC.

Даже если Texture.isReadable является true, CopyTexture не копирует пиксельные данные на CPU, если копируете только область сжатой текстуры.

Дополнительные ресурсы: CopyTextureSupport, Texture2D.CopyPixels.