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