版本: Unity 6 (6000.0)
语言英语
  • C#

Texture2D.GetPixelData

建议修改

成功!

感谢您帮助我们改进 Unity 文档的质量。尽管我们无法接受所有提交内容,但我们会阅读用户提出的每个建议变更,并在适用的情况下进行更新。

关闭

提交失败

由于某种原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们改进 Unity 文档的质量。

关闭

取消

声明

public NativeArray<T> GetPixelData(int mipLevel);

参数

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 在失败时会抛出异常。

其他资源:ApplySetPixelsSetPixels32GetPixelData

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); } }