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