mipLevel | 要从此级别读取的渐进贴图。范围是 0 到纹理的 Texture.mipmapCount。默认值是 0 。 |
NativeArray<T> 一个本地数组,它直接指向 CPU 内存中纹理的数据缓冲区。
获取纹理的原始数据。
此方法会返回一个 NativeArray<T0>,它直接指向 CPU 上纹理的数据并具有渐进贴图级别的尺寸。该数组不包含数据的副本,因此 GetPixelData
不会分配任何内存。
例如,如果纹理格式为 16 × 16 × 16 像素和 RGBA32,并且将 mipLevel
设置为 1
,如果对 T
使用 Color32(每个像素 4 个字节),则该方法会返回一个具有 512 个元素(8 × 8 × 8 像素)和 2048 个字节大小的数组。您可以使用实验性的 GraphicsFormatUtility.ComputeMipmapSize API 来计算渐进贴图级别的尺寸。
对于 T
,您通常会使用匹配纹理中像素结构的结构,例如,如果纹理格式使用 32 位格式的 RGBA 像素,如 TextureFormat.RGBA32,则使用 Color32。
您可以读取和写入返回的数组,以直接在 CPU 内存中获取和更改数据。如果写入数组,您必须调用 Apply 方法以将纹理上载到 GPU。
立即使用返回的数组。如果您存储该数组并在之后使用,如果纹理已修改或更新,则该数组可能指向不正确的内存位置。
如果您对 T
使用小的类型,例如 byte
、GetPixelData
,则可能会失败,因为 NativeArray
将超过最大长度 (Int32.MaxValue
)。要避免这种情况,请使用更大的类型或结构体。
失败时,GetPixelData
会抛出一个异常。
其他资源:应用、设置像素、设置像素32、获取像素数据。
using UnityEngine;
public class ExampleScript : MonoBehaviour { public void Start() { // Create a 3D texture var m_Texture3D = new Texture3D(16, 16, 16, TextureFormat.RGBA32, true);
// Use GetPixelData to get an array that points to mipmap level 1 var mip1Data = m_Texture3D.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_Texture3D.Apply(false); } }