NativeArray<T> 指向 CPU 内存中纹理数据缓冲区的本机数组。
以指向内存的数组形式获取纹理的原始数据。
此版本的 GetRawTextureData
方法返回一个 NativeArray<T0>,它直接指向 CPU 上的纹理数据。该数组不包含数据的副本,因此 GetRawTextureData
不会分配任何内存。要返回副本,请使用返回 byte[]
数组的版本。
您还可以使用 GetPixelData。您可以使用 GetPixelData
获取mipmap 级别,而不是整个纹理。
通常,您会为 T
使用一个结构体,该结构体与纹理中像素的结构匹配,例如,如果纹理格式使用 32 位格式的 RGBA 像素,例如 TextureFormat.RGBA32,则使用 Color32。
返回的数组包含整个纹理,根据其宽度、高度、数据 格式 和 mipmapCount。例如,如果纹理为 16 × 8 像素,且为 RGBA32 格式,没有 mipmap,则该方法将返回大小为 512 字节(16 × 8 × 4 字节)的数组,如果使用 Color32 作为 T
(每个像素 4 字节),则包含 128 个元素。您可以使用实验性的 GraphicsFormatUtility.ComputeMipmapSize API 来计算 mipmap 级别的大小。
该数组从 mipmap 级别 0 开始。
您可以读取和写入返回的数组,以直接在 CPU 内存中获取和更改数据。如果写入数组,则必须调用 Apply 方法将纹理上传到 GPU。
立即使用返回的数组。如果您存储数组并在以后使用它,如果纹理已被修改或更新,它可能不会指向正确的内存位置。
如果您为 T
使用小类型(例如 byte
),GetRawTextureData
可能会失败,因为 NativeArray
将超过最大长度(Int32.MaxValue
)。为避免这种情况,请使用更大的类型或结构体。GetRawTextureData
在失败时会抛出异常。
其他资源:Apply、SetPixels、SetPixels32、LoadRawTextureData、GetPixelData。
using UnityEngine;
public class ExampleScript : MonoBehaviour { void Start() { var texture = new Texture2D(128, 128, TextureFormat.RGBA32, false); GetComponent<Renderer>().material.mainTexture = texture;
// RGBA32 texture format data layout exactly matches Color32 struct var data = texture.GetRawTextureData<Color32>();
// fill texture data with a simple pattern Color32 orange = new Color32(255, 165, 0, 255); Color32 teal = new Color32(0, 128, 128, 255); int index = 0; for (int y = 0; y < texture.height; y++) { for (int x = 0; x < texture.width; x++) { data[index++] = ((x & y) == 0 ? orange : teal); } } // upload to the GPU texture.Apply(); } }
byte[] 包含原始纹理数据的字节数组。
以副本的形式获取纹理的原始数据。
此版本的 GetRawTextureData
方法返回 CPU 上原始纹理数据的副本。Texture.isReadable 必须为 true
。
如果您不需要副本,或者想要直接修改数据,请使用返回 NativeArray
的此函数版本,或使用 Texture2D.GetPixelData。
您可以将返回的数组与 LoadRawTextureData 一起使用。这使您可以序列化和加载任何格式的纹理(包括压缩纹理),并在以后将数据加载到纹理中。
如果您使用 Graphics.CopyTexture 等仅更新 GPU 纹理的方法,则 CPU 纹理可能与 GPU 纹理不匹配,因此 CPU 纹理不同步。
返回数组的最大大小为 2 千兆字节,因为 C# 数组最多有 20 亿个元素。如果您需要超过 2 千兆字节的数据,请使用返回 NativeArray
的此函数版本,并使用 Color32 作为 T
或与纹理格式匹配的结构体。GetRawTextureData
在失败时会抛出异常。
using UnityEngine;
class CopyTexture : MonoBehaviour { // the source texture. Texture2D tex;
void Start() { // Create a copy of the texture by reading and applying the raw texture data. Texture2D texCopy = new Texture2D(tex.width, tex.height, tex.format, tex.mipmapCount > 1); texCopy.LoadRawTextureData(tex.GetRawTextureData()); texCopy.Apply(); } }