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

Texture2D.GetRawTextureData

建议更改

成功!

感谢您帮助我们提升 Unity 文档的质量。虽然我们无法接受所有提交内容,但我们会阅读用户提出的每项建议更改,并在适用时进行更新。

关闭

提交失败

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

关闭

取消

声明

public NativeArray<T> GetRawTextureData();

返回值

NativeArray<T> 指向 CPU 内存中纹理数据缓冲区的本机数组。

描述

以指向内存的数组形式获取纹理的原始数据。

此版本的 GetRawTextureData 方法返回一个 NativeArray<T0>,它直接指向 CPU 上的纹理数据。该数组不包含数据的副本,因此 GetRawTextureData 不会分配任何内存。要返回副本,请使用返回 byte[] 数组的版本。

您还可以使用 GetPixelData。您可以使用 GetPixelData 获取mipmap 级别,而不是整个纹理。

通常,您会为 T 使用一个结构体,该结构体与纹理中像素的结构匹配,例如,如果纹理格式使用 32 位格式的 RGBA 像素,例如 TextureFormat.RGBA32,则使用 Color32

返回的数组包含整个纹理,根据其宽度、高度、数据 格式mipmapCount。例如,如果纹理为 16 × 8 像素,且为 RGBA32 格式,没有 mipmap,则该方法将返回大小为 512 字节(16 × 8 × 4 字节)的数组,如果使用 Color32 作为 T(每个像素 4 字节),则包含 128 个元素。您可以使用实验性的 GraphicsFormatUtility.ComputeMipmapSize API 来计算 mipmap 级别的大小。

该数组从 mipmap 级别 0 开始。

您可以读取和写入返回的数组,以直接在 CPU 内存中获取和更改数据。如果写入数组,则必须调用 Apply 方法将纹理上传到 GPU。

立即使用返回的数组。如果您存储数组并在以后使用它,如果纹理已被修改或更新,它可能不会指向正确的内存位置。

如果您为 T 使用小类型(例如 byte),GetRawTextureData 可能会失败,因为 NativeArray 将超过最大长度(Int32.MaxValue)。为避免这种情况,请使用更大的类型或结构体。

GetRawTextureData 在失败时会抛出异常。

其他资源:ApplySetPixelsSetPixels32LoadRawTextureDataGetPixelData

using UnityEngine;

public class ExampleScript : MonoBehaviour { void Start() { var texture = new Texture2D(128, 128, TextureFormat.RGBA32, false); GetComponent<Renderer>().material.mainTexture = texture;

// RGBA32 texture format data layout exactly matches Color32 struct var data = texture.GetRawTextureData<Color32>();

// fill texture data with a simple pattern Color32 orange = new Color32(255, 165, 0, 255); Color32 teal = new Color32(0, 128, 128, 255); int index = 0; for (int y = 0; y < texture.height; y++) { for (int x = 0; x < texture.width; x++) { data[index++] = ((x & y) == 0 ? orange : teal); } } // upload to the GPU texture.Apply(); } }

声明

public byte[] GetRawTextureData();

返回值

byte[] 包含原始纹理数据的字节数组。

描述

以副本的形式获取纹理的原始数据。

此版本的 GetRawTextureData 方法返回 CPU 上原始纹理数据的副本。Texture.isReadable 必须为 true

如果您不需要副本,或者想要直接修改数据,请使用返回 NativeArray 的此函数版本,或使用 Texture2D.GetPixelData

您可以将返回的数组与 LoadRawTextureData 一起使用。这使您可以序列化和加载任何格式的纹理(包括压缩纹理),并在以后将数据加载到纹理中。

如果您使用 Graphics.CopyTexture 等仅更新 GPU 纹理的方法,则 CPU 纹理可能与 GPU 纹理不匹配,因此 CPU 纹理不同步。

返回数组的最大大小为 2 千兆字节,因为 C# 数组最多有 20 亿个元素。如果您需要超过 2 千兆字节的数据,请使用返回 NativeArray 的此函数版本,并使用 Color32 作为 T 或与纹理格式匹配的结构体。

GetRawTextureData 在失败时会抛出异常。

using UnityEngine;

class CopyTexture : MonoBehaviour { // the source texture. Texture2D tex;

void Start() { // Create a copy of the texture by reading and applying the raw texture data. Texture2D texCopy = new Texture2D(tex.width, tex.height, tex.format, tex.mipmapCount > 1); texCopy.LoadRawTextureData(tex.GetRawTextureData()); texCopy.Apply(); } }