mipLevel | 要读取的mipmap 级别。范围是 0 到纹理的 Texture.mipmapCount。默认值为 0 。 |
NativeArray<T> 一个指向 CPU 内存中纹理数据缓冲区的本机数组。
获取纹理的原始数据。
此方法返回一个 NativeArray<T0>,它直接指向 CPU 上的纹理数据,并且具有 mipmap 级别的大小。该数组不包含数据的副本,因此 GetPixelData
不分配任何内存。
例如,如果纹理是 16 × 16 像素,并且是 RGBA32 格式,并且您将 mipLevel
设置为 1
,则该方法将返回一个包含 64 个元素(8 × 8 像素)的数组,如果使用 Color32 作为 T
(每个像素 4 个字节),则大小为 256 个字节。可以使用实验性的 GraphicsFormatUtility.ComputeMipmapSize API 来计算 mipmap 级别的大小。
通常会使用与纹理中像素结构匹配的结构体作为 T
,例如,如果纹理格式使用 32 位格式的 RGBA 像素,例如 TextureFormat.RGBA32,则使用 Color32。
可以读取和写入返回的数组,以直接在 CPU 内存中获取和更改数据。如果写入数组,则必须调用 Apply 方法将纹理上传到 GPU。
立即使用返回的数组。如果存储数组并在以后使用它,则如果纹理已被修改或更新,它可能不会指向正确的内存位置。
如果使用诸如 byte
之类的小类型作为 T
,则 GetPixelData
可能会失败,因为 NativeArray
会超过最大长度 (Int32.MaxValue
)。为了避免这种情况,请使用更大的类型或结构体。GetPixelData
在失败时会抛出异常。
其他资源:Apply、SetPixels、SetPixels32、GetPixelData。
using UnityEngine;
public class ExampleScript : MonoBehaviour { public void Start() { // Create a texture var m_Texture2D = new Texture2D(16, 16, TextureFormat.RGBA32, true);
// Use GetPixelData to get an array that points to mipmap level 1 var mip1Data = m_Texture2D.GetPixelData<Color32>(1);
// Fill pixels in mipmap level 1 with white for (int i = 0; i < mip1Data.Length; i++) { mip1Data[i] = new Color32(255, 255, 255, 255); }
// Copy the texture changes to the GPU m_Texture2D.Apply(false); } }